Spring Data Jpa条件组合查询 带分页

如果要实现 and 条件A and 条件B and (条件C or 条件D) 的 用法

 public Page<AA> getList(Pageable pageable, QueryVO QueryVO) {
        Page<AA> data = repository.findAll((Specification<AA>) (root, criteriaQuery, criteriaBuilder) -> {
            List<Predicate> list = new ArrayList<>();

            List<Predicate> orList = new ArrayList<>();
            //订单号
            if (StringUtils.hasLength(QueryVO.getOrderNumber())) {
                orList.add(criteriaBuilder.equal(root.get("orderNumber").as(String.class), QueryVO.getOrderNumber()));

            }
            // like 模糊查询
            if (StringUtils.hasLength(QueryVO.getApplicant())) {
                orList.add(criteriaBuilder.like(root.get("applicant").as(String.class), QueryVO.getApplicant()));
            }
            
			//   or 的条件    用 and 的 list 把它装起来
            if (orList.size() > 0) {
                Predicate or = criteriaBuilder.or(orList.toArray(new Predicate[orList.size()]));
                list.add(or);
            }

            //开始时间
            if (StringUtils.hasLength(QueryVO.getStartDate())) {
                list.add(criteriaBuilder.greaterThanOrEqualTo(root.get("createTime").as(String.class), QueryVO.getStartDate()));
            }
            //结束时间
            if (StringUtils.hasLength(QueryVO.getEndDate())) {
                list.add(criteriaBuilder.lessThanOrEqualTo(root.get("createTime").as(String.class), QueryVO.getStartDate()));
            }

            // and 拼接起来
            Predicate and = criteriaBuilder.and(list.toArray(new Predicate[list.size()]));
            // where 查询
            criteriaQuery.where(and);
            // 如果pageable 里面没有指定排序字段  就会采用下面的排序
            criteriaQuery.orderBy(criteriaBuilder.desc(root.get("createTime")));
            return criteriaQuery.getRestriction();
        }, pageable);

最后的执行的SQL如下:

select *  from aa where (order_number=? or applicant like ?) and cast(create_time as varchar(255))>=? order by create_time desc limit ?

2.jpa 多个条件排序

            Predicate and = criteriaBuilder.and(list.toArray(new Predicate[list.size()]));
            // where 查询
            criteriaQuery.where(and);
            // 如果pageable 里面没有指定排序字段  就会采用下面的排序
            Order createTime = criteriaBuilder.desc(root.get("createTime"));
            Order id = criteriaBuilder.asc(root.get("id"));
            // 按照这两个字段来排序  
            criteriaQuery.orderBy(createTime, id);
            return criteriaQuery.getRestriction();
        }, pageable);

效果如下:

  select * from aa where order_number=? order by id asc, create_time desc limit ?

版权声明:本文为lone2620原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。