Specifications动态查询

方法列表

    Optional<T> findOne(@Nullable Specification<T> var1); //查询单个对象

    List<T> findAll(@Nullable Specification<T> var1); //查询列表
//查询全部 分页    
//Specification  查询条件
//Pageable   分页参数  -->两个参数   第一个是第几页 第二个是每页多少个
//返回值   分页pagebean page是springdatajpa提供的
    Page<T> findAll(@Nullable Specification<T> var1, Pageable var2);
//查询列表
//sort 排序参数  排序上的需求
    List<T> findAll(@Nullable Specification<T> var1, Sort var2);
    //统计查询  根据条件统计
        long count(@Nullable Specification<T> var1);

Specification: 查询条件

代表所有的查询条件 我们把所有的查询条件封装成一个这样的对象传递过来就是了

他是一个接口在这里插入图片描述

自定义自己的Specification实现类

实现一个方法  
//root  查询的根对象(查询的任何属性都可以从根对象中获取)
//criteriaquery 顶层查询对象  -> 自定义查询方式 了解 一般不用
//criteriabuilder 查询的构造器  封装了很多查询的条件
 Predicate toPredicate(Root<T> var1, CriteriaQuery<?> var2, CriteriaBuilder var3);

以下是一个完整的例子

@Service
public class MgrLostService {
    @Autowired
    LostRepository lostRepository;

    public QueryResponseResult findAllMgrLost(int page, int size, MgrQueryLostRequest mgrQueryLostRequest) {
        Specification<Lost> specification = new Specification<Lost>() {
            @Override
            /**
             * 自定义查询条件
             *      1.实现Specification接口(提供泛型,查询对象的类型)
             *      2.实现toPredicate方法(构造条件查询)
             *      3.需要借助方法参数中的两个参数(
             *          root:获取需要查询的对象属性
             *          CriteriaBuilder:构造查询条件,内部封装了很多查询条件(模糊匹配,精确匹配...)
             *
             *      查询条件
             *          1.查询方式
             *              cb对象中
             *          2.比较的属性名称
             *              root对象中
             *
             */
            public Predicate toPredicate(Root<Lost> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
                //用于暂时存放查询条件的集合
                List<Predicate> predicatesList = new ArrayList<>();
                //构造查询条件
                //获取比较的属性
                if (!StringUtils.isEmpty(mgrQueryLostRequest.getUserId()) && mgrQueryLostRequest.getUserId() != null) {
                    /**
                     * 第一个参数是要比较的属性 -> path对象
                     * 第二个参数是要比较的值
                     */
                    Predicate userid = criteriaBuilder.equal(root.get("userId"), mgrQueryLostRequest.getUserId());
                    predicatesList.add(userid);
                }
                if (mgrQueryLostRequest.getSchoolId() != null && mgrQueryLostRequest.getSchoolId().size() != 0) {
                    predicatesList.add(criteriaBuilder.equal(root.get("schoolId"), mgrQueryLostRequest.getSchoolId()));
                }
                if (!StringUtils.isEmpty(mgrQueryLostRequest.getCategory()) && mgrQueryLostRequest.getCategory() != null) {
                    predicatesList.add(criteriaBuilder.equal(root.get("category"), mgrQueryLostRequest.getCategory()));
                }
                if (mgrQueryLostRequest.getStartTime() != null) {
                    predicatesList.add(criteriaBuilder.equal(root.get("startTime"), mgrQueryLostRequest.getStartTime()));
                }
                if (mgrQueryLostRequest.getEndTime() != null) {
                    predicatesList.add(criteriaBuilder.equal(root.get("endTime"), mgrQueryLostRequest.getEndTime()));
                }
                if (!StringUtils.isEmpty(mgrQueryLostRequest.getState()) && mgrQueryLostRequest.getState() != null) {
                    predicatesList.add(criteriaBuilder.equal(root.get("state"), mgrQueryLostRequest.getState()));
                }
                return criteriaBuilder.and(predicatesList.toArray(new Predicate[predicatesList.size()]));
            }
        };
        Pageable pageable = new PageRequest(page, size);
        Page<Lost> pagelist = lostRepository.findAll(specification, pageable);
        QueryResult queryResult = new QueryResult();
        queryResult.setList(pagelist.getContent());//数据列表
        queryResult.setTotal(pagelist.getTotalElements());//数据总记录数
        System.out.println(new QueryResponseResult(CommonCode.SUCCESS, queryResult).toString());
        return new QueryResponseResult(CommonCode.SUCCESS, queryResult);
    }
}

在这里插入图片描述在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值