记录一下最近写分页以及动态查询,以及对返回的page对象的处理
分页以及动态查询
因为要动态查询,继承JpaRepository+注解的方式请见:https://blog.csdn.net/qq_43948440/article/details/111557411.
这里使用EntityManager。分页使用Spring Data 库中的分页接口。
之后根据条件拼接SQL,进行查询,返回分页的page对象。
代码:
设置分页参数:
Pageable pageable;
//参数对应分别为:第几页,每页显示条数
pageable = PageRequest.of(page-1,pageNum);
注 意 : \color{red}{注意:} 注意: 如果不重写Pageable的话,设置第几页的时候需要减一,因为默认是从0开始的。上边参数还可以添加排序方式,如果需要,添加即可,例如(通过id降序排序):
pageable = PageRequest.of(page-1,pageNum, Sort.Direction.DESC, "id");
下面是我自己封装的一个分页的代码,传入查询的SQL语句以及Pageable对象即可:
//分页
public Page<T> pageResult(String querySql, Pageable pageable){
//查询数据条数
String countSql = "SELECT COUNT(*) FROM ( "+ querySql +" ) getcount";
Query countQuery = entityManager.createNativeQuery(countSql);
//总条数
BigDecimal totalCount = (BigDecimal) countQuery.getSingleResult();
Query query = entityManager.createNativeQuery(querySql);
query.setFirstResult((int) pageable.getOffset());
query.setMaxResults(pageable.getPageSize());
query.unwrap(NativeQueryImpl.class).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
List resultList = query.getResultList();
Page<T> page = new PageImpl<>(resultList,pageable,totalCount.longValue());
return page;
}
对返回的page的处理
以上返回的page包含了数据信息以及分页信息,因为我只需要数据信息,以及总页码数,所以封装了返回结果对象:
@Data
public class PageRsp {
private Integer totalPages;
private List<Info> infoList = new ArrayList<>();
}
取出需要的数据并赋值给对象:
List infoList = infoPage.getContent();
PageRsp rsp = new PageRsp();
rsp.getInfoList().addAll(infoList);
rsp.setTotalPages(infoPage.getTotalPages());
之后将数据返回即可。
这是为了简便提取出的代码,在方法中稍加修改即可使用。另外如果需要其他的分页信息,对返回的page处理即可。