SpringDataJpa的Specification查询

Sort sort = new Sort(Sort.Direction.DESC, "startTime");
List<ForumApprove> list = forumApproveRepository.findAll(new Specification<ForumApprove>() {
    @Override
    public Predicate toPredicate(Root<ForumApprove> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder cb) {
        List<Predicate> one = new ArrayList<>();
        List<Predicate> two = new ArrayList<>();
        List<Predicate> three = new ArrayList<>();
        List<Predicate> four = new ArrayList<>();

        //团队
        if(fa.getType()==null){
            log.debug("type为空");
        } else if (fa.getType() == 4) {
            if(fa.getGroupBy()==null){
            //个人
                one.add(root.get(Constants.CREATED_BY).in(userDetails.getOpenId()));
                one.add(root.get(Constants.INITIATORID).isNull());
                one.add(root.get(Constants.END_TIME).isNull());

                two.add(root.get(Constants.APPROVERS).in(userDetails.getOpenId()));
                two.add(root.get(Constants.EXECUTOR_TYPE).in(2));
                two.add(root.get(Constants.STATUS).in(0));

                three.add(root.get(Constants.CREATED_BY).in(userDetails.getOpenId()));
                three.add(root.get(Constants.APPROVE_TYPE).in(4));
            }else if(fa.getGroupBy()!=null){
                one.add(root.get(Constants.GROUP_BY).in(fa.getGroupBy()));
                one.add(root.get(Constants.CREATED_BY).in(userDetails.getOpenId()));
                one.add(root.get(Constants.INITIATORID).isNull());
                one.add(root.get(Constants.END_TIME).isNull());

                two.add(root.get(Constants.APPROVERS).in(userDetails.getOpenId()));
                two.add(root.get(Constants.GROUP_BY).in(fa.getGroupBy()));
                two.add(root.get(Constants.EXECUTOR_TYPE).in(2));
                two.add(root.get(Constants.STATUS).in(0));

                three.add(root.get(Constants.GROUP_BY).in(fa.getGroupBy()));
                three.add(root.get(Constants.APPROVE_TYPE).in(4));
                three.add(root.get(Constants.CREATED_BY).in(userDetails.getOpenId()));
            }else{
                log.debug("输入错误");
            }
        }
        else if (fa.getType() == 1) {
            if (fa.getGroupBy() != null) {
                one.add(cb.equal(root.get(Constants.GROUP_BY), fa.getGroupBy()));
            }
            if (fa.getStatus() == null) {
                throw new ServiceException(ErrorConstants.APPROVAL_FIND_CREATED_ERROR, Constants.APPROVAL_FIND_CREATED_ERROR);
            } else if (fa.getStatus() == 0) {
                one.add(root.get(Constants.CREATED_BY).in(userDetails.getOpenId()));
                one.add(root.get(Constants.INITIATORID).isNull());
                one.add(root.get(Constants.END_TIME).isNull());
            } else if (fa.getStatus() == 1) {
                one.add(root.get(Constants.CREATED_BY).in(userDetails.getOpenId()));
                one.add(root.get(Constants.INITIATORID).isNull());
                one.add(root.get(Constants.END_TIME).isNotNull());
            } else {
                throw new ServiceException(ErrorConstants.APPROVAL_FIND_CREATED_ERROR, Constants.APPROVAL_FIND_CREATED_ERROR);
            }
            //我申请的
        } else if (fa.getType() == 2) {
            if (fa.getGroupBy() != null) {
                one.add(cb.equal(root.get(Constants.GROUP_BY), fa.getGroupBy()));
            }
            if (fa.getStatus() == null) {
                throw new ServiceException(ErrorConstants.APPROVAL_FIND_APPROVE_ERROR, Constants.APPROVAL_FIND_APPROVE_ERROR);
            } else if (fa.getStatus() == 0) {
                one.add(root.get(Constants.EXECUTOR_TYPE).in(2));
                one.add(root.get(Constants.APPROVERS).in(userDetails.getOpenId()));
                one.add(root.get(Constants.STATUS).in(0));
                one.add(root.get(Constants.EXECUTION_TIME).isNull());

            } else if (fa.getStatus() == 1) {
                one.add(root.get(Constants.EXECUTOR_TYPE).in(2));
                one.add(root.get(Constants.APPROVERS).in(userDetails.getOpenId()));
                one.add(root.get(Constants.STATUS).in(1, 2));
            } else {
                throw new ServiceException(ErrorConstants.APPROVAL_FIND_APPROVE_ERROR, Constants.APPROVAL_FIND_APPROVE_ERROR);
            }
            //我审批的
        } else if (fa.getType() == 3) {
            //抄送我的
            if (fa.getGroupBy() != null) {
                one.add(cb.equal(root.get(Constants.GROUP_BY), fa.getGroupBy()));
            }
            if (fa.getStatus() == null) {
                throw new ServiceException(ErrorConstants.APPROVAL_FIND_COPY_ERROR, Constants.APPROVAL_FIND_COPY_ERROR);
            } else if (fa.getStatus() == 0) {
                //已完成的并且全部通过的审批单才会在抄送我的
                one.add(root.get(Constants.EXECUTOR_TYPE).in(0));
                one.add(root.get(Constants.APPROVERS).in(userDetails.getOpenId()));
                one.add(root.get(Constants.STATUS).in(0));
                one.add(root.get("adopt").in(1));
            } else if (fa.getStatus() == 1) {
                one.add(root.get(Constants.EXECUTOR_TYPE).in(0));
                one.add(root.get(Constants.APPROVERS).in(userDetails.getOpenId()));
                one.add(root.get(Constants.STATUS).in(1));
            } else {
                throw new ServiceException(ErrorConstants.APPROVAL_FIND_COPY_ERROR, Constants.APPROVAL_FIND_COPY_ERROR);
            }
        } else {
            throw new ServiceException(ErrorConstants.APPROVAL_FIND_TYPE_NOT_EXISTENT, Constants.APPROVAL_FIND_TYPE_NOT_EXISTENT);
        }
        four.add(root.get("tenantId").in(fa.getTenantId()));
        Predicate[] fours = new Predicate[four.size()];

        Predicate[] first = new Predicate[one.size()];
        Predicate[] second = new Predicate[two.size()];
        Predicate[] third = new Predicate[three.size()];

        if (second.length == 0) {
            return cb.and(cb.and(one.toArray(first)), cb.and(four.toArray(fours)));
        } else {
            return cb.or(cb.and(one.toArray(first)), cb.and(two.toArray(second)), cb.and(three.toArray(third)));
        }
    }
}, sort);

猜你喜欢

转载自blog.csdn.net/qq_39438729/article/details/79375302