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

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。

PS : mybatis 中也有对于 criteria 的使用,见另一文章:mybatis :Criteria 查询、条件过滤用法

 

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;
    }

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值