JPA实现多条件分页查询
作者:小炎说java
这篇文章主要介绍了JPA实现多条件分页查询方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
JPA多条件分页查询
- jpa单表自定义查询条件
- 同时支持分页查询
分页查询准备工作
- 1:实体类注入pageNum与pageSIze,建议pageNum为1,pageSize为100000,这样可以保证没有分页查询时,可以查询全部的数据
- 2:默认定义好,同时需要添加@Transient,非数据库字段
public class 实体类 { @Transient private int pageNum=1; @Transient private int pageSize=10000; |
使用分页查询
- 1:PageRequest.of():生成带有开始页,尺寸,排序方式,排序字段的Pageable
- 2:这里因为一开始定义的pageNum为1,需减1
- 3:这么使用,是方便前端的设值,以及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多条件动态分页查询
之前发过用JPA接口动态查询,单独写了个EXT扩展类拼接sql语句,随着我入行时间的增加,我变强了,所以我在这里记录分享一个更为简单的动态分页查询方法。
废话少说,上代码了:
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()); }
接受参数看具体情况 ,用了拉姆达表达式,这样子然后sql直接可以用jpa内部接口就好了,简单暴力管用,无敌了!
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。