先看一个条件放在where后面的
//分页及排序
pageInfo.setNumber(pageInfo.getNumber() - 1);
Pageable pageable = new PageRequest(pageInfo.getNumber(), pageInfo.getSize(), Sort.Direction.DESC, "issueDate");
//查询条件
Specification<Expert> specification = (root, cq, cb) -> {
List<Predicate> preList = new ArrayList<>();
if (StringUtils.isNotEmpty(date)) {
Join<Expert, ExpertType> join =root.join("expertAppointment", JoinType.LEFT);
preList.add(cb.and(cb.like(join.get("date").as(String.class),"%"+date+"%")));
}
// distince去重
cq.distinct(true);
preList.add(cb.and(cb.equal(root.get("creator").as(String.class), userId)));
return cb.and(preList.toArray(new Predicate[preList.size()]));
};
// 执行查询
Page<Expert> pageData = expertRepository.findAll(specification, pageable);
看下这个查询的sql:
可以看到高级查询的条件是在where后面。
把高级查询条件换成这种:
if (StringUtils.isNotEmpty(date)) {
Join<Expert, ExpertType> join =root.join("expertAppointment", JoinType.LEFT);
join.on(cb.and(cb.like(join.get("date").as(String.class),"%"+date+"%")));
}
这样条件是在on后面,而不是放到where里面了。