版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}
- 进行封装 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;
}
}
进行封装自己的查询参数:这个就不再多说了 。
SpingMVC controller
//所有的终端与车辆关联的信息
@RequestMapping("/vehicleAndTerminal.json")
@ResponseBody
public HashMap<String, Object> vehicleAndTerminal(PageQuery pageQuery, Terminal terminal){
return terminalService.vehicleAndTerminal(pageQuery, terminal);
}
- 进行业务层代码 :
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;
}