java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > JPA多条件分页查询

JPA实现多条件分页查询

作者:小炎说java

这篇文章主要介绍了JPA实现多条件分页查询方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

JPA多条件分页查询

分页查询准备工作

public class 实体类 {

    @Transient
    private int pageNum=1;

    @Transient
    private int pageSize=10000;
|

使用分页查询

Pageable pageable=PageRequest.of(recruit.getPageNum()-1,recruit.getPageSize(),
                Sort.Direction.DESC,"createTime");

recruitRepository.findAll(specification,pageable);

自定义查询条件

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内部接口就好了,简单暴力管用,无敌了!

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文