JPA實現(xiàn)多條件分頁查詢
更新時間:2024年07月17日 09:24:20 作者:小炎說java
這篇文章主要介紹了JPA實現(xiàn)多條件分頁查詢方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
JPA多條件分頁查詢
- jpa單表自定義查詢條件
- 同時支持分頁查詢
分頁查詢準(zhǔn)備工作
- 1:實體類注入pageNum與pageSIze,建議pageNum為1,pageSize為100000,這樣可以保證沒有分頁查詢時,可以查詢?nèi)康臄?shù)據(jù)
- 2:默認(rèn)定義好,同時需要添加@Transient,非數(shù)據(jù)庫字段
public class 實體類 {
@Transient
private int pageNum=1;
@Transient
private int pageSize=10000;
|使用分頁查詢
- 1:PageRequest.of():生成帶有開始頁,尺寸,排序方式,排序字段的Pageable
- 2:這里因為一開始定義的pageNum為1,需減1
- 3:這么使用,是方便前端的設(shè)值,以及ui分頁查詢的
- 4:指定排序字段,必須要帶_
Pageable pageable=PageRequest.of(recruit.getPageNum()-1,recruit.getPageSize(),
Sort.Direction.DESC,"createTime");
recruitRepository.findAll(specification,pageable);自定義查詢條件
- 1:首先需要判定傳入的值是否存在,且不為空
- 2:時間類型為between and,需保證兩個時間都不為空
- 3:JPA支持in equal like between and
- 4:reposotory層需繼承JpaRepository,JpaSpecificationExecutor
Specification<PersonnelRecruit> specification = (root, criteriaQuery, criteriaBuilder) -> {
List<Predicate> predicates = new ArrayList<>();
if (StringUtils.isNotBlank(recruit.getDept())) {
predicates.add(criteriaBuilder.equal(root.get("dept"),recruit.getDept()));
}
if (StringUtils.isNotBlank(recruit.getName())) {
predicates.add(criteriaBuilder.like(root.get("name"),"%"+recruit.getName()+"%"));
}
if (ObjectUtils.isNotNull(recruit.getCreateTime()) && ObjectUtils.isNotNull(recruit.getCreateEndTime())) {
predicates.add(criteriaBuilder.between(root.get("createTime"),recruit.getCreateTime(),recruit.getCreateEndTime()));
}
Predicate[] p = predicates.toArray(new Predicate[0]);
return criteriaBuilder.and(p);
};
Pageable pageable=PageRequest.of(recruit.getPageNum()-1,recruit.getPageSize(),
Sort.Direction.DESC,"createTime");
return recruitRepository.findAll(specification,pageable);JPA多條件動態(tài)分頁查詢
之前發(fā)過用JPA接口動態(tài)查詢,單獨寫了個EXT擴展類拼接sql語句,隨著我入行時間的增加,我變強了,所以我在這里記錄分享一個更為簡單的動態(tài)分頁查詢方法。
廢話少說,上代碼了:
public Page<QualityTaskDto> findQualityTaskByPage(Integer pageNum, Integer pageSize, String tasktype, String jobname, String satellite) {
Sort sort = Sort.by(Sort.Direction.ASC, "creatTime");
Pageable pageable = new PageRequest(pageNum,pageSize,sort);
Specification<DbDmsQualityTaskInfoDTO> specification = (root, query, cb) ->{
List<Predicate> predicates = new LinkedList<>();
if(StringUtils.isNotBlank(tasktype)){
predicates.add(cb.equal(root.get("tasktype"),tasktype));
}
if(StringUtils.isNotBlank(jobname)){
predicates.add(cb.like(root.get("jobname"),"%"+jobname+"%"));
}//模糊查詢
if(StringUtils.isNotBlank(satellite)){
predicates.add(cb.equal(root.get("satellite"),satellite));
}
return cb.and(predicates.toArray(new Predicate[predicates.size()]));
};
Page<DbDmsQualityTaskInfoDTO> all = qualityTaskInfoDAO.findAll(specification,pageable);
List<QualityTaskDto> qualityTaskDtos = qualityTaskDto.db2Dto(all.getContent());
return new PageImpl<>(qualityTaskDtos,pageable,all.getTotalElements());
}
接受參數(shù)看具體情況 ,用了拉姆達(dá)表達(dá)式,這樣子然后sql直接可以用jpa內(nèi)部接口就好了,簡單暴力管用,無敵了!
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
MyBatis Plus整合Redis實現(xiàn)分布式二級緩存的問題
Mybatis內(nèi)置的二級緩存在分布式環(huán)境下存在分布式問題,無法使用,但是我們可以整合Redis來實現(xiàn)分布式的二級緩存,這篇文章給大家介紹MyBatis Plus整合Redis實現(xiàn)分布式二級緩存,感興趣的朋友跟隨小編一起看看吧2023-11-11

