SpringData JPA 实现动态条件查询(包含分页、排序)
1、repository层接口 继承JpaSpecificationExecutor
public interface UserRepository extends JpaRepository<User, Integer>,JpaSpecificationExecutor<User>{
}
注意:
Page<T> findAll(Specification<T> spec, Pageable pageable); //分页按条件查询 List<T> findAll(Specification<T> spec); //不分页按条件查询
2、service层重写toPredicate方法
public Page<User> getUserByIf(User user,Integer page,Integer size){
return userRepository.findAll(new Specification<User>() {
@Override
public Predicate toPredicate(Root<User> root, CriteriaQuery<?> query, CriteriaBuilder builder) {
List<Predicate> predicates = new ArrayList<>();
if(StringUtils.isNotBlank(user.getName())){
predicates.add(builder.like(root.get("name"), "%"+user.getName()+"%")); like
}
if(user.getAge()!=null){
predicates.add(builder.greaterThanOrEqualTo(root.get("age"), user.getAge()));// >=
}
if(user.getId()!=null){
predicates.add(builder.lessThanOrEqualTo(root.get("id"), user.getId()));// <=
}
return builder.and(predicates.toArray(new Predicate[predicates.size()]));
}
}, new PageRequest(page, size, Direction.ASC, "id"));
}