如果要实现 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版权协议,转载请附上原文出处链接和本声明。