Spring Data JPA 使用JpaSpecificationExecutor实现多条件查询(非分页查询)

文章目录

    • 1、Repository层继承`JpaSpecificationExecutor`
    • 2、Service层编写方法设置筛选条件Specification
    • 3、在Service层调用刚刚编写的方法和Repository层的方法实现查询
      • ①非分页查询
      • ②分页查询

1、Repository层继承JpaSpecificationExecutor

如下:

@Repository
public interface UserRepository extends JpaRepository<UserDO,Long>, JpaSpecificationExecutor<UserDO> {

}

说明:
JpaSpecificationExecutor 实现了多条件查询,有如下几个已定义的接口:
1、获取单个对象数据
2、根据筛选条件查询所有数据
3、根据筛选条件分页查询所有数据
4、根据筛选条件查询所有数据并根据参数进行排序
5、根据筛选条件查询数据总数

public interface JpaSpecificationExecutor<T> {

    Optional<T> findOne(@Nullable Specification<T> var1);

    List<T> findAll(@Nullable Specification<T> var1);

    Page<T> findAll(@Nullable Specification<T> var1, Pageable var2);

    List<T> findAll(@Nullable Specification<T> var1, Sort var2);

    long count(@Nullable Specification<T> var1);
}

2、Service层编写方法设置筛选条件Specification

示例:根据用户名和电话号码进行筛选:
可以进行模糊查询和大小写设置

private Specification<UserDO> buildWhereClause(String username,String userPhone){
        return (Root<UserDO> root, CriteriaQuery<?> query, CriteriaBuilder cb) -> {

            List<Predicate> predicatesList = new ArrayList<>();
            //和 != null有什么区别?和isNotEmpty呢?
            if(StringUtils.isNotBlank(username)){
                predicatesList.add(cb.like(cb.lower(root.get("username").as(String.class)),"%" + username.toLowerCase() + "%"));
            }
            if(StringUtils.isNotBlank(userPhone)){
                predicatesList.add(cb.like(root.get("userPhone").as(String.class), userPhone + "%"));
            }

            Predicate[] andPredicate = new Predicate[predicatesList.size()];
            return cb.and(predicatesList.toArray(andPredicate));
        };
    }

CriteriaBuilder除了这里的模糊查询like方法之外,还有如下方法:
equal:相等;gt:filed > value;lt:小于;ge:大于等于;le:小于等于;
notLike;notEqual

3、在Service层调用刚刚编写的方法和Repository层的方法实现查询

①非分页查询

	@Override
    public List<UserBO> findByConditions(UserBO userBO) {

        //调用buildWhereClause获取列表
        Specification<UserDO> userDOSpecification = buildWhereClause(userBO.getUsername(),userBO.getUserPhone());
        List<UserDO> userDOList = userRepository.findAll(userDOSpecification);
		//遍历UserDO转为UserBO再对userBOList进行返回即可,不写了
        return null;
    }

②分页查询

其实只是多加了一个参数page,但是这个返回参数要怎么从Page转为Page呢…这个暂时还没有时间去看,所以就留到后面有空再来补充吧。

	public Page<UserBO> findPageByConditions(UserBO userBO, Pageable page){
        Specification<UserDO> userDOSpecification = buildWhereClause(userBO.getUsername(),userBO.getUserPhone());
        Page<UserDO> userDOPage = userRepository.findAll(userDOSpecification,page);
        
        return null;
    }

调用示例:

Page<UserBO> userBOPageList = findPageByConditions(userBO, new PageRequest(1, 10));

你可能感兴趣的:(SSM,Spring,JPA,多条件查询)