iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >在JPA中criteriabuilder使用or拼接多个like语句
  • 938
分享到

在JPA中criteriabuilder使用or拼接多个like语句

2024-04-02 19:04:59 938人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

目录criteriabuilder使用or拼接多个like语句sql语句类似于sql语句如下java-jpa-criteriabuilder使用一个复杂的查询例子criteriabu

criteriabuilder使用or拼接多个like语句

项目中有两张表,一张角色和机构的关系表role_work_site_relation,存放的是机构的id和角色的id,另一张表member_info表中存放用户相关信息。

机构为树形结构,role_work_site_relation中存放的是当前角色中的所有机构id。

查询member_info时需要根据role_work_site_relation查询到有权限的相应机构下的数据。

而member_info中存放的机构id是包含其父级机构的。需要再查询时,首先查出所有的最低一级机构,再根据id到用户表中模糊匹配,中间需要用or拼接。

sql语句类似于


SELECT * FROM member_info WHERE 得了= 0 AND ( memberinfo0_.ORG_IDS LIKE ? OR memberinfo0_.ORG_IDS LIKE ?..)

sql语句如下


 //查询工地  搜索框有内容时
 if (!StrUtil.isEmptyIfStr(conditions.get("orgIds"))){
         predicate1.getExpressions().add(criteriaBuilder.equal(root.get("orgIds"), conditions.get("orgIds")));
 //  搜索框没有内容时,查询是当前角色下的机构       
  }else {
        //以or拼接工地的id集合
        if (bottomLevelDataPermission.size() > 0){
            List predicateList = new ArrayList();
            Predicate [] p = new Predicate[bottomLevelDataPermission.size()];
            for (String dataPermission : bottomLevelDataPermission) {
                predicateList.add(criteriaBuilder.like(root.get("orgIds"),"%" + dataPermission));
            }
            predicateList.toArray(p);
            predicate1.getExpressions().add(criteriaBuilder.or(p));
        }
    }
 //根据工地id查询用户相关信息
  if (!StrUtil.isEmptyIfStr(conditions.get("workSite"))) {
        predicate.getExpressions().add(criteriaBuilder.equal(root.join("workSite").get("id"),conditions.get("workSite")));
    }

java-jpa-criteriabuilder使用

一个复杂的查询例子

包含常用的所有查询方法


CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();     //查询结果所需要的类型(Entity相对应)
        CriteriaQuery<Entity> criteriaQuery = criteriaBuilder.createQuery(Entity.class);     //查询所需要的主体类(Entity0相对应)
        Root<Entity0> root = criteriaQuery.from(Entity0.class);     //查询结果-select(此处查询所有符合条件的主体类)
        criteriaQuery.select(root);     //过滤条件用Predicate方法拼接
        Predicate restrictions = criteriaBuilder.conjunction();     //过滤条件——equal(当Entity0关联member类时,Entity0:member=m:1)
        restrictions = criteriaBuilder.and(restrictions, criteriaBuilder.equal(root.get("member"), member));
        //过滤条件——like
        restrictions = criteriaBuilder.and(restrictions, criteriaBuilder.like(root.<String>get("str"), "%"+str+"%"));
        //用户名查询(member里面的username匹配) ———— 多层查询 ———— 子查询的一种:适用于m:1或1:1(即多对一或一对一)
        restrictions = criteriaBuilder.and(restrictions, criteriaBuilder.like(root.get("member").<String>get("username"), "%"+username+"%"));
        //子查询(规范写法,先判断查询内容是否存在)(适用于1:m)(即一对多)
        if (searchType != null || searchValue != null || hasExpired != null || status != null || type != null || isPendingReceive != null || isPendingRefunds != null || isAllocatedStock != null || businessType != null) {
            //建立子查询        Subquery<Order> orderSubquery = criteriaQuery.subquery(Order.class);
            Root<Order> orderSubqueryRoot = orderSubquery.from(Order.class);
            orderSubquery.select(orderSubqueryRoot);       //子查询和父查询相关联
            Predicate orderRestrictions = criteriaBuilder.equal(orderSubqueryRoot.<MergeOrder>get("mergeOrder"), root);
            //子查询过滤条件拼接
            if (searchType != null && searchValue != null) {if ("phone".equals(searchType)) {
                    orderRestrictions = criteriaBuilder.and(orderRestrictions, criteriaBuilder.like(orderSubqueryRoot.<String>get("phone"), "%"+searchValue+"%"));
                }
            }if (type != null) {
                CriteriaBuilder.In<Order.Type> in = criteriaBuilder.in(orderSubqueryRoot.<Order.Type>get("type"));
                in.value(type);
                orderRestrictions = criteriaBuilder.and(orderRestrictions, in);
            }
            //and、or以及判断是否为null,比较(>)的使用(比较可以用于日期比较)
            if (hasExpired != null) {
                orderRestrictions = criteriaBuilder.and(orderRestrictions, criteriaBuilder.or(orderSubqueryRoot.get("expire").isNull(), criteriaBuilder.greaterThan(orderSubqueryRoot.<Date>get("expire"), new Date())));
            }
            // not的使用方法(不符合上述过滤条件),notEqual的使用,<(小于)的使用
            if (isPendingReceive != null) {
                restrictions = criteriaBuilder.and(restrictions, criteriaBuilder.equal(root.get("paymentMethodType"), PaymentMethod.Type.cashOnDelivery));
                Predicate predicate = criteriaBuilder.and(criteriaBuilder.or(orderSubqueryRoot.get("expire").isNull()
                        , criteriaBuilder.greaterThan(orderSubqueryRoot.<Date>get("expire"), new Date()))
                        , criteriaBuilder.notEqual(orderSubqueryRoot.get("status"), Order.Status.completed)
                        , criteriaBuilder.lessThan(orderSubqueryRoot.<BigDecimal>get("amountPaid"), orderSubqueryRoot.<BigDecimal>get("amount")));
                if (isPendingReceive) {
                    orderRestrictions = criteriaBuilder.and(orderRestrictions, criteriaBuilder.not(predicate));
                }
            }// 多层查询使用if (businessType != null) {
                orderRestrictions = criteriaBuilder.and(orderRestrictions, criteriaBuilder.equal(orderSubqueryRoot.get("store").get("business").get("businessType"), businessType));
            }       // 拼接过滤条件
            orderSubquery.where(orderRestrictions);
            // 和总条件拼接(exists的使用)
            restrictions = criteriaBuilder.and(restrictions, criteriaBuilder.exists(orderSubquery));
        }
        criteriaQuery.where(restrictions);     TypedQuery<Entity> query = entityManager.createQuery(criteriaQuery);     Entity singleResult = query.getSingleResult();

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: 在JPA中criteriabuilder使用or拼接多个like语句

本文链接: https://www.lsjlt.com/news/160125.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 在JPA中criteriabuilder使用or拼接多个like语句
    目录criteriabuilder使用or拼接多个like语句sql语句类似于sql语句如下java-jpa-criteriabuilder使用一个复杂的查询例子criteriabu...
    99+
    2024-04-02
  • 如何在C语言中使用if语句处理多个条件?
    如何在C语言中使用if语句处理多个条件? 在C语言中,我们经常需要根据不同情况做出不同的处理。使用if语句可以帮助我们实现这一目的,而当需要处理多个条件时,可以结合if-else语句或...
    99+
    2024-04-02
  • 使用SQL语句将相同名的多行字段内容拼接起来
    以下内容来自CHATGPT,其中PGADMIN经实验,有效 1、在MYSQL中使用: 可以使用GROUP_CONCAT函数来实现相同名称的多行字段内容拼接。具体语法如下: SELECT col...
    99+
    2023-09-08
    sql mysql
  • 如何使用R语言ggplot2实现将多个照片拼接到一起
    这篇文章将为大家详细讲解有关如何使用R语言ggplot2实现将多个照片拼接到一起,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。将多个照片拼接到一起,然而电脑上没有安装ps 和 ai (拼图我暂时只想到这两...
    99+
    2023-06-20
  • 怎么在SQL语句中使用JOIN连接数据库
    这篇文章给大家介绍怎么在SQL语句中使用JOIN连接数据库,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。通常有以下几种连接方式:JOIN  or  INNER JO...
    99+
    2024-04-02
  • 如何使用 CREATE TABLE 语句在 MySQL 表中拥有多个虚拟生成列?
    很可能在 MySQL 表中添加多个虚拟生成列。可以用以下示例来说明:示例mysql> Create table profit(cost int, price int, profit int AS (price-cost), price...
    99+
    2023-10-22
  • 我们如何使用 CREATE TABLE 语句在 MySQL 表中存储多个生成列?
    很可能在 MySQL 表中添加多个存储的生成列。可以用以下示例来说明:示例mysql> Create table profit1(cost int, price int, profit int AS (price-cost) STOR...
    99+
    2023-10-22
  • Oracle数据库中怎么使用多余两个表的SELECT语句
    这篇文章主要介绍Oracle数据库中怎么使用多余两个表的SELECT语句,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Oracle数据库中连接可以用于连接任意多个表。下面这个...
    99+
    2024-04-02
  • 怎么在JavaScript中使用join连接多个数组
    怎么在JavaScript中使用join连接多个数组?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。JavaScript可以做什么1.可以使网页具有交互性,例如响应用户点击,...
    99+
    2023-06-14
  • 如何在MySQL中使用JOIN来连接多个表格
    在MySQL中,您可以使用JOIN语句来连接多个表格。以下是一个简单的例子: 假设我们有两个表格,一个是用户表(users),另一个...
    99+
    2024-03-06
    MySQL
  • 怎么在mysql中使用多个left join连接查询
    这期内容当中小编将会给大家带来有关怎么在mysql中使用多个left join连接查询,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。mysql查询时需要连接多个表时,比如...
    99+
    2024-04-02
  • 在JS中避免过多的使用IF语句方法有哪些
    本篇内容主要讲解“在JS中避免过多的使用IF语句方法有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“在JS中避免过多的使用IF语句方法有哪些”吧!1. 三元...
    99+
    2024-04-02
  • 如何在Python 中使用 join() 函数把列表拼接成一个字符串
    目录1.设置 end=’’2.拼接字符串(string)3.举例内容概要:如何把列表中的元素拼接为一个字符串呢?本文介绍了采用 join() 函数的解决方法。...
    99+
    2024-04-02
  • 在Java项目中使用IO流实现一个音频剪切和拼接功能
    今天就跟大家聊聊有关在Java项目中使用IO流实现一个音频剪切和拼接功能,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。需求: 使用IO流将指定目录下的若干个音频文件的高潮部分,进行剪...
    99+
    2023-05-31
    java io流 ava
  • 怎么在Python中使用sql语句多条件模糊查询mysql数据库
    怎么在Python中使用sql语句多条件模糊查询mysql数据库?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。def find_worldByName(c_nam...
    99+
    2023-06-14
  • 如何使用SQL语句在MySQL中进行数据连接和联合查询?
    如何使用SQL语句在MySQL中进行数据连接和联合查询?数据连接和联合查询是 SQL 语言中常用的技巧,能够在多个表中获取和筛选所需的数据。在 MySQL 中,我们可以通过使用 JOIN 子句来实现数据连接,使用 UNION 和 U...
    99+
    2023-12-17
    MySQL 数据连接 SQL语句
  • 怎么在Ubuntu Linux 16.04 LTS中使用多个连接加速 apt-get/apt
    小编给大家分享一下怎么在Ubuntu Linux 16.04 LTS中使用多个连接加速 apt-get/apt,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!你需要...
    99+
    2023-06-16
  • 在html代码中如何直接使用空格键键入多个空格键
    这篇文章主要介绍在html代码中如何直接使用空格键键入多个空格键,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完! 在html代码中直接使用空格键键入多个空格键,而实际网页浏览器展示一...
    99+
    2024-04-02
  • Go语言接口使用教程:如何在编程算法中实现多态?
    Go语言是一种强类型的编程语言,它支持接口类型。接口类型是一种抽象类型,它定义了一组方法集,但没有实现这些方法。因此,接口类型可以用来描述任何实现了这些方法的类型。在Go语言中,接口类型是实现多态的关键。 接口的定义 在Go语言中,接口类...
    99+
    2023-10-23
    接口 教程 编程算法
  • 如何在 Go 语言中使用函数关键字来处理多个文件?
    在 Go 语言中,我们经常需要处理多个文件,比如读取多个文件的内容进行合并,或者对多个文件进行处理。这时候,函数关键字就可以派上用场了。本文将介绍如何在 Go 语言中使用函数关键字来处理多个文件。 一、处理多个文件的基本方法 在 Go 语...
    99+
    2023-10-23
    函数 关键字 文件
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作