JPA实现多条件分页查询

 更新时间:2024年07月17日 09:24:20   作者:小炎说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内部接口就好了,简单暴力管用,无敌了!

总结

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

相关文章

  • spring controller层引用service报空指针异常nullpointExceptio问题

    spring controller层引用service报空指针异常nullpointExceptio问题

    这篇文章主要介绍了spring controller层引用service报空指针异常nullpointExceptio问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • 详解Java多线程编程中互斥锁ReentrantLock类的用法

    详解Java多线程编程中互斥锁ReentrantLock类的用法

    Java多线程并发的程序中使用互斥锁有synchronized和ReentrantLock两种方式,这里我们来详解Java多线程编程中互斥锁ReentrantLock类的用法:
    2016-07-07
  • Java8中Optional操作的实际应用

    Java8中Optional操作的实际应用

    Optional类是一个可以为null的容器对象,如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象,下面这篇文章主要给大家介绍了关于Java8中Optional操作实际应用的相关资料,需要的朋友可以参考下
    2022-02-02
  • logback如何自定义日志存储

    logback如何自定义日志存储

    这篇文章主要介绍了logback如何自定义日志存储的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • spring boot如何指定启动端口

    spring boot如何指定启动端口

    这篇文章主要介绍了spring boot如何指定启动端口,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • java 基本算法之归并排序实例代码

    java 基本算法之归并排序实例代码

    这篇文章主要介绍了java 基本算法之归并排序实例代码的相关资料,需要的朋友可以参考下
    2017-05-05
  • springboot中的Application.properties常用配置

    springboot中的Application.properties常用配置

    这篇文章主要介绍了springboot中的Application.properties常用配置,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • java分布式面试系统限流最佳实践

    java分布式面试系统限流最佳实践

    这篇文章主要介绍了java分布式面试系统限流最佳实践场景分析解答,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
    2022-03-03
  • Spring框架web项目实战全代码分享

    Spring框架web项目实战全代码分享

    这篇文章主要介绍了Spring框架web项目实战全代码分享,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • JPA默认值设置没有效果的解决

    JPA默认值设置没有效果的解决

    这篇文章主要介绍了JPA默认值设置没有效果的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11

最新评论