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

本文介绍了如何在Spring Data JPA中进行原生SQL查询并实现分页。通过封装PageBean和自定义查询参数,配合SpringMVC Controller和业务层代码,利用entityManagerFactory动态拼接SQL,从而实现灵活的查询和分页功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

因为业务的原因今天写了一个原生的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;
    }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值