前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >jpa : criteria 作排除过滤、条件中除去查出的部分数据、JPA 一个参数可查询多个字段

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

作者头像
微风-- 轻许--
发布2022-04-13 15:47:11
2.4K0
发布2022-04-13 15:47:11
举报
文章被收录于专栏:java 微风java 微风

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

1. 业务场景:

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

于是尝试写为:

代码语言:javascript
复制
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) . 在微信端要求在一个输入框中实现多种类型数据查询。可输入“姓名、项目名称、工作任务、工作类型” 中的任意一种,并作相应条件过滤。

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

代码语言:javascript
复制
  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. 最终实现:

代码语言:javascript
复制
  @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;
    }
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-07-23 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档