spring-data-jpa 作排除过滤、条件中除去查出的部分数据、JPA 一个参数可查询多个字段

1. 业务场景:

(1) . 按业务条件查到所有数据后,要过滤掉其中 “当前领导自己填报的但不由自己审批的数据” ,本来我一直在想是不是会有和 sql 中类似于 except 效果的实现 ,就一直想找这个方法,但没有点出这个方法来,直到在源码中看到一个 not 方法 。

于是尝试写为:

Predicate a = cb.notEqual(root.get("approverId"), uid); // 非他审批
Predicate b = cb.equal(root.get("employeeId"), uid); // 他填报
list.add(cb.and(a, b).not()); 这样可以得到 cb.and(a, b) 结果的反集,实现去除效果。

(2) .  在微信端要求在一个输入框中实现多种类型数据查询。可输入“姓名、项目名称、工作任务、工作类型” 中的任意一种,并作相应条件过滤。

这种只给一个参数却可能代表多种类型数据的实现 如下:

  Predicate p = cb.or(cb.like(root.get("employeeName"), "%" + search + "%"));
                    p = cb.or(p, cb.like(root.get("busName"), "%" + search + "%"));
                    p = cb.or(p, cb.like(root.get("projectName"), "%" + search + "%"));
                    p = cb.or(p, cb.like(root.get("jobTypeName"), "%" + search + "%"));
                    list.add(p);

2. 最终实现:

  @Override
    public Object findByPage(Pageable pageable, final String employeeId, final String employeeName, String beginDate, String endDate,
                             final String departmentId, final Integer status, final String processInstanceId,
                             final String approveId, final String jobTypeId,
                             final String projectId, final String busId, final String search, final String uid) {

        Page<WorkWeight> page = workWeightRepository.findAll(new Specification<WorkWeight>() {
            @Override
            public Predicate toPredicate(Root<WorkWeight> root, CriteriaQuery<?> query, CriteriaBuilder cb) {

                List<Predicate> list = Lists.newArrayList();
                //构造条件
                list.add(cb.equal(root.get("delFlag"), "0"));

               
                // 参数 search 可代表姓名、项目名称、工作任务、工作类型中的任意一种
                if (StringUtils.isNotEmpty(search)) {
                    Predicate p = cb.or(cb.like(root.get("employeeName"), "%" + search + "%"));
                    p = cb.or(p, cb.like(root.get("busName"), "%" + search + "%"));
                    p = cb.or(p, cb.like(root.get("projectName"), "%" + search + "%"));
                    p = cb.or(p, cb.like(root.get("jobTypeName"), "%" + search + "%"));
                    list.add(p);
                }

                               
                // 去掉当前领导自己填报的但不由自己审批的数据。
                if (StringUtils.isNotEmpty(uid)) {
                    Predicate a = cb.notEqual(root.get("approverId"), uid); // 非他审批
                    Predicate b = cb.equal(root.get("employeeId"), uid);// 他填报
                    list.add(cb.and(a, b).not());  // not 指取反,A && B 等价于 !A || !B
                }

                
                Predicate[] p = new Predicate[list.size()];
                return cb.and(list.toArray(p));
            }
        }, new PageRequest(pageable.getPageNumber(), pageable.getPageSize(), pageable.getSort()));

        return page;
    }

猜你喜欢

转载自blog.csdn.net/u011314442/article/details/81165135