首页 > 其他分享 >Spirng Data JPA 之Specification中and、or的使用

Spirng Data JPA 之Specification中and、or的使用

时间:2023-02-16 17:12:15浏览次数:35  
标签:Predicate JPA Specification predicates1 parentCode criteriaBuilder predicates Da

项目中,有的地方存值以逗号分隔的方式来存储,但查询的时候是需要满足单个值或者多个值条件查询,因此用到Specification中and、or组合使用,此文用来记录,以防后用。

描述:
parentCode逗号分隔,同一parentCode下有且只能有一个名称相同的标签对象,新增传值parentCode逗号分隔,可多个,用下面查询方法来做校验。

 

 

    private List<LabelInfo> getDimensionList(LabelInfo labelInfo) {
        Specification<LabelInfo> specification = (Root<LabelInfo> root, CriteriaQuery<?> query,
                                                  CriteriaBuilder criteriaBuilder) -> {
            //parentCode条件拆分组装
            String[] parentCodes = labelInfo.getParentCode().split(",");
            List<Predicate> predicates1 = new ArrayList<>();
            for (String parentCode : parentCodes) {
                if (!StringUtil.isNullStr(parentCode)) {
                    Predicate pred = criteriaBuilder.like(root.get("parentCode"), "%" + parentCode + "%");
                    predicates1.add(pred);
                }
            }
            //or条件组合
            Predicate predicateOr = criteriaBuilder.or(predicates1.toArray(new Predicate[predicates1.size()]));
            predicateOr = criteriaBuilder.and(predicateOr);
            //and条件组合
            List<Predicate> predicates = new ArrayList<>();
            predicates.add(criteriaBuilder.equal(root.get("level"), 3));
            predicates.add(criteriaBuilder.like(root.get("name"), "%" + labelInfo.getName() + "%"));
            Predicate predicateAnd = criteriaBuilder.and(predicates.toArray(new Predicate[predicates.size()]));
            //组合查询
            return query.where(predicateOr, predicateAnd).getRestriction();
        };
        return labelInfoRepository.findAll(specification);
    }

 

标签:Predicate,JPA,Specification,predicates1,parentCode,criteriaBuilder,predicates,Da
From: https://www.cnblogs.com/exmyth/p/17127430.html

相关文章

  • Specifications动态查询
    【前言说明】针对CRUD种的查询,因为我们的查询总是具有各种各样的筛选条件为了我们的程序能够更加适应筛选条件的变化,SpringDataJpa提供了Specifications这种解决方案 ......
  • JPA使用Specification构建动态查询
    封装Specification查询条件,在SpringDataJPA2.0以前使用Specifications这个辅助类来操作where、not、and和or连接,在2.0版本以后这个类会被剔除,可以直接使用Specificat......
  • Android  JetPack~ LiveData (一)   介绍与使用
    一般情况下LiveData都是搭配这ViewModel使用,这里先介绍一下LiveData,再结合ViewModel使用Android数据绑定技术一,企业级开发Android数据绑定技术二,企业级开发Androi......
  • 【WPF】带模糊搜索的DataGrid
    带模糊搜索的DataGrid前端代码view<Windowx:Class="MVVM.Views.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:......
  • 实现一个简单的Database10(译文)
    GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源。GreatSQL是MySQL的国产分支版本,使用上与MySQL一致。作者:花家舍文章来源:GreatSQL社区原创前......
  • Android JetPack~ DataBinding(数据绑定)(一) 集成与使用
    近期将会梳理一下JetPack全家桶的使用,包括DataBinding,Room,ViewModel,LiveData,Navigation等。本来打算先写DataBinding的使用,没想到在17年的时候已经写过了,这里就补充一点......
  • 使用part.write抛出的异常 IOException:Unexpected output data (外层)和 sun.nio.fs.Win
    原因是我要测试文件上传到h20230214_2_war_exploded工程目录的upload目录下,一开始没有创建upload这个目录,我以为它会自己创建,因为之前使用输出流都是会自己创建没有的目录......
  • spring-data-jpa
    spring-data-jpa一、什么是jpa?查询语言:JPQL,面向对象的查询语句1.1相同处:都跟数据库操作有关,JPA是JDBC的升华,升级版。JDBC和JPA都是一组规范接口1.2不同处:JDBC......
  • 关于DataTable的一些操作
    关于DataTable的一些操作 1.数据筛选:dt.AsEnumerable().Where(r=>r.Field<string>("Name").StartsWith("A")).FirstOrDefault(); 2.注意AsEnumerable不可连续......
  • 211. Design Add and Search Words Data Structure[Medium]
    211.DesignAddandSearchWordsDataStructureDesignadatastructurethatsupportsaddingnewwordsandfindingifastringmatchesanypreviouslyaddedstr......