1、先封装and条件
List<Predicate> listAnd = new ArrayList<Predicate>();
//这里是hql,所以root.get(),方法里面必须是对应的实体属性
//listAnd.add(criteriaBuilder.equal(root.get("status"), UserStatus.enable));
listAnd.add(criteriaBuilder.equal(root.get("role"), "root"));
Predicate[] array_and=new Predicate[listAnd.size()];
Predicate Pre_And = criteriaBuilder.and(listAnd.toArray(array_and));
2、再封装or条件
List<Predicate> listOr = new ArrayList<Predicate>();
listOr.add(criteriaBuilder.like(root.get("nickName"), "%" + vo.getNickName() + "%"));
listOr.add(criteriaBuilder.like(root.get("nickName"), "%" + vo.getNickName() + "%"));
Predicate[] arrayOr = new Predicate[listOr.size()];
Predicate Pre_Or = criteriaBuilder.or(listOr.toArray(arrayOr));
3、最后把and和or条件拼接在一起并返回
return criteriaQuery.where(Pre_And,Pre_Or).getRestriction();
4、成品就是这样子的
虽然代码多了一点,但结构和思路十分清晰。
public Page<TUser> list(SearchUser vo){
Pageable pageable = PageRequest.of(vo.getPage(),vo.getSize(), Sort.Direction.ASC, "createTime");
Specification<TUser> specification = sql(vo);
return tUserRepository.findAll(specification, pageable);
}
public Specification<TUser> sql(SearchUser vo){
return new Specification<TUser>() {
public Predicate toPredicate(Root<TUser> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
//封装and语句
List<Predicate> listAnd = new ArrayList<Predicate>();
//这里是hql,所以root.get(),方法里面必须是对应的实体属性
//listAnd.add(criteriaBuilder.equal(root.get("status"), UserStatus.enable));
listAnd.add(criteriaBuilder.equal(root.get("role"), "root"));
Predicate[] array_and=new Predicate[listAnd.size()];
Predicate Pre_And = criteriaBuilder.and(listAnd.toArray(array_and));
//封装or语句
List<Predicate> listOr = new ArrayList<Predicate>();
listOr.add(criteriaBuilder.like(root.get("nickName"), "%" + vo.getNickName() + "%"));
listOr.add(criteriaBuilder.like(root.get("nickName"), "%" + vo.getNickName() + "%"));
Predicate[] arrayOr = new Predicate[listOr.size()];
Predicate Pre_Or = criteriaBuilder.or(listOr.toArray(arrayOr));
return criteriaQuery.where(Pre_And,Pre_Or).getRestriction();
//单独使用 and 时返回
//return criteriaQuery.where(Pre_And).getRestriction();
//单独使用 or 时返回
//return criteriaQuery.where(Pre_And).getRestriction();
}
};
}