SpringDataJpA复杂查询实现自定义排序

news/2024/7/5 1:46:48

需求:

列表页面实现按合同状态自定义排序

private Specification<TblContractPre> whereClause(final TblContractPre entity) {
    return new Specification<TblContractPre>() {

      @Override
      public Predicate toPredicate(Root<TblContractPre> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
        List<Predicate> list = new ArrayList<Predicate>();
        if (entity.getId() != null) {
          list.add(cb.equal(root.get("id").as(Long.class), entity.getId()));
        }
        if ("1".equals(entity.getFrom())) {
          UserObject user = UserObjectHelper.currentUserObject();
          List<String> ids = DataUtil.findAuditByCurUser(user, WorkflowType.HB_CONTRACT_ONLINE);
          if (ids.isEmpty()) {
            list.add(root.get("id").as(Long.class).in(0));
          } else {
            list.add(root.get("id").as(Long.class).in(UtilPublic.strArrToListLong(ids.toArray(new String[] {}))));
          }
        }
        if (StringUtils.isNotBlank(entity.getHouseName())) {
          list.add(cb.like(root.get("houseName").as(String.class), "%" + entity.getHouseName() + "%"));
        }
        if (StringUtils.isNotBlank(entity.getDeedsn())) {
          list.add(cb.equal(root.get("deedsn").as(String.class), entity.getDeedsn()));
        }
        if (entity.getDeptId() != null) {
          list.add(root.get("deptId").as(Integer.class).in(DataUtil.findSubDeptIds(entity.getDeptId())));
        }
        if (StringUtils.isNotBlank(entity.getSalesmanName())) {
          list.add(cb.equal(root.get("salesmanName").as(String.class), entity.getSalesmanName()));
        }
        UserObject user = UserObjectHelper.currentUserObject();
        if (user != null) {
          if (user.isSales()) {
            list.add(cb.equal(root.get("salesmanName").as(String.class), user.getUserCode()));
          } else if (user.isBus()) {
            list.add(root.get("deptId").as(Integer.class).in(user.getDeptIdList()));
          }
        }
        if (entity.getContractStatus() != null) {
          list.add(cb.equal(root.get("contractStatus").as(Byte.class), entity.getContractStatus()));
        }
        if (StringUtils.isNotBlank(entity.getDateType())) {
          if (entity.getDeedsnStart() != null) {
            list.add(cb.greaterThanOrEqualTo(root.get(entity.getDateType()).as(Date.class), entity.getDeedsnStart()));
          }
          if (entity.getDeedsnEnd() != null) {
            list.add(cb.lessThanOrEqualTo(root.get(entity.getDateType()).as(Date.class), entity.getDeedsnEnd()));
          }
        }
        if (entity.getCompanyType() != null) {
          list.add(cb.equal(root.get("companyType").as(CompanyType.class), entity.getCompanyType()));
        }

        List<Order> orders = new ArrayList<>();
        orders.add(cb.asc(cb.selectCase().when(cb.equal(root.get("contractStatus").as(Byte.class), 2), 1)
            .when(cb.equal(root.get("contractStatus").as(Byte.class), 4), 2)
            .when(cb.equal(root.get("contractStatus").as(Byte.class), 1), 3)
            .when(cb.equal(root.get("contractStatus").as(Byte.class), 3), 4).otherwise(10)));
        orders.add(cb.desc(root.get("createDate")));
        query.orderBy(orders);

        Predicate[] p = new Predicate[list.size()];
        return query.where(cb.and(list.toArray(p))).getGroupRestriction();
      }
    };
  }


http://lihuaxi.xjx100.cn/news/244629.html

相关文章

CSS id选择器

2019独角兽企业重金招聘Python工程师标准>>> 一 id选择器 id选择器可以为标有特定id的html元素指定特定的样式。 id选择器以#来定义。 下面的两个id选择器&#xff0c;第一个可以定义元素的颜色为红色&#xff0c;第二个定义元素的颜色为绿色&#xff1a; #red{ col…

Centos下安装mysql 总结

一、MySQL安装 Centos下安装mysql 请点开:http://www.centoscn.com/CentosServer/sql/2013/0817/1285.html 二、MySQL的几个重要目录 MySQL安装完成后不象SQL Server默认安装在一个目录&#xff0c;它的数据库文件、配置文件和命令文件分别在不同的目录&#xff0c;了解这些目录…

共享程序集和强命名程序集(3):强命名程序集的一些作用

强命名程序集能防篡改 用私钥对程序集进行签名&#xff0c;并将公钥和签名嵌入程序集&#xff0c;CLR就可以炎症程序集未被修改或破坏。程序集安装到GAC时&#xff0c;系统对包含清单的那个文件的内容进行哈希处理&#xff0c;将Hash值与PE文件中嵌入的RSA数字签名进行比较。如…

eclipse中安装使用Gradle构建工具

1.下载二进制文件并解压如下&#xff1a; 下载网址&#xff1a;https://gradle.org/releases/ 2.配置gradle环境变量 3.验证是否安装成功 4.在eclipse中下载gradle插件并配置 5.重启eclipse,新建一个gradle项目&#xff0c;选择gradle即可

玩具javascript:cookie管理

2019独角兽企业重金招聘Python工程师标准>>> ;(function(window, undefined){var CookieUtil window.CookieUtil window.CookieUtil || {};var doc window.document;// 读取名称为name的Cookie信息CookieUtil.read function(name){// 暂无Cookieif(doc.cookie.l…

【自然语言处理(NLP)】基于SQuAD的机器阅读理解

【自然语言处理&#xff08;NLP&#xff09;】基于SQuAD的机器阅读理解 作者简介&#xff1a;在校大学生一枚&#xff0c;华为云享专家&#xff0c;阿里云专家博主&#xff0c;腾云先锋&#xff08;TDP&#xff09;成员&#xff0c;云曦智划项目总负责人&#xff0c;全国高等学…

最大子段和问题

题目&#xff1a;HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢…

layerconfirm确认框的使用

$(#id-act-cancel).click(function() { layer.confirm(确定要作废该合同&#xff1f;, { btn : [确定, 取消] // 按钮 }, function() { var arrItemId []; $("tbody :checkbox:checked", $table).each(fun…