Spring Data Jpa 进行原生Sql 分页和条件查询

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_38616723/article/details/80283822

因为业务的原因今天写了一个原生的Spring Data jpa的分页查询 :

1 .进行封装自己PageQuery:
    public class PageQuery {

    public Integer getPage() {
        return page - 1;
    }

    public void setPage(Integer page) {
        this.page = page;
    }

    public Integer getSize() {
        return size;
    }

    public void setSize(Integer size) {
        this.size = size;
    }

    @NotNull(message = "参数不允许为空")
    private Integer page = 1; // 默认为1
    @NotNull(message = "参数不允许为空")
    private Integer size = 20;

}
  1. 进行封装 PageBean .
import java.util.List;
public class PageBean<T> {
    private Long totalCount; // 总记录数
    private List<T> pageData; // 每页记录数
    public Long getTotalCount() {
        return totalCount;
    }
    public void setTotalCount(Long totalCount) {
        this.totalCount = totalCount;
    }
    public List<T> getPageData() {
        return pageData;
    }
    public void setPageData(List<T> pageData) {
        this.pageData = pageData;
    }


}
  1. 进行封装自己的查询参数:这个就不再多说了 。

  2. SpingMVC controller

    //所有的终端与车辆关联的信息
    @RequestMapping("/vehicleAndTerminal.json")
    @ResponseBody
    public HashMap<String, Object> vehicleAndTerminal(PageQuery pageQuery, Terminal terminal){

        return  terminalService.vehicleAndTerminal(pageQuery, terminal);
    }
  1. 进行业务层代码 :
    5.1 注入entityManagerFactory
@Autowired
    private LocalContainerEntityManagerFactoryBean entityManagerFactory;

5.2 进行原生的Sql 拼接

// 此处用了原生的sql拼接
    // 有Sql注入的风险
    @Override
    public HashMap<String, Object> vehicleAndTerminal(PageQuery pageQuery, Terminal terminal) {
        HashMap<String, Object> map = new HashMap<String, Object>();
        String sql = "SELECT * FROM terminal t WHERE t.vSn IS NOT NULL AND t.vSn!=''";
        Integer page = pageQuery.getPage();
        Integer size = pageQuery.getSize();

        String vSn = terminal.getvSn();
        if (vSn != null) {
            sql += "AND t.vSn=" + vSn + " ";
        }
        String vin = terminal.getVin();
        if (vin != null) {
            sql += "AND t.vin=" + vin + " ";
        }
        String num = terminal.getNum();
        if (num != null) {
            sql += "AND t.num=" + num + " ";
        }
        String barcode = terminal.getBarcode();

        if (barcode != null) {
            sql += "AND t.barcode=" + barcode + " ";
        }
        sql += "LIMIT" + " " + page + "," + size;
        EntityManager em = entityManagerFactory.getNativeEntityManagerFactory().createEntityManager();
        Query nativeQuery = em.createNativeQuery(sql, Terminal.class);
        @SuppressWarnings({ "unused", "unchecked" })
        List<Terminal> termins = nativeQuery.getResultList();
        if (em != null) {
            em.close();
        }
        map.put("total", termins.size());
        map.put("rows", termins);
        return map;
    }

这样就实现了动态查询 ,以及分页。 上面的代码 我自己封装的PageBean 没有用上 ,下面的代码是改过的

public PageBean<Terminal> vehicleAndTerminal(PageQuery pageQuery, Terminal terminal) {
        HashMap<String, Object> map = new HashMap<String, Object>();
        String sql = "SELECT * FROM terminal t WHERE t.vSn IS NOT NULL AND t.vSn!=''";
        Integer page = pageQuery.getPage();
        Integer size = pageQuery.getSize();

        String vSn = terminal.getvSn();
        if (vSn != null) {
            sql += "AND t.vSn=" + vSn + " ";
        }
        String vin = terminal.getVin();
        if (vin != null) {
            sql += "AND t.vin=" + vin + " ";
        }
        String num = terminal.getNum();
        if (num != null) {
            sql += "AND t.num=" + num + " ";
        }
        String barcode = terminal.getBarcode();

        if (barcode != null) {
            sql += "AND t.barcode=" + barcode + " ";
        }
        sql += "LIMIT" + " " + page + "," + size;
        EntityManager em = entityManagerFactory.getNativeEntityManagerFactory().createEntityManager();
        Query nativeQuery = em.createNativeQuery(sql, Terminal.class);
        @SuppressWarnings({ "unused", "unchecked" })
        List<Terminal> termins = nativeQuery.getResultList();
        if (em != null) {
            em.close();
        }
        // map.put("total", termins.size());
        // map.put("rows", termins);
        // return map;

        PageBean<Terminal> pageBean = new PageBean<>();

        pageBean.setTotalCount((long) termins.size());

        pageBean.setPageData(termins);

        return pageBean;
    }

猜你喜欢

转载自blog.csdn.net/qq_38616723/article/details/80283822