Spring Boot JPA:为同一参数传递多个值 (JPQL)

2023-12-06

我正在使用 JPQL 在 JPA 中编写 SQL 查询CurdRepository界面。我能够使用命名参数编写多个查询,它们的工作方式就像一个魅力。

但是,我的应用程序要求我将未知数量的字符串与表中的多个列进行匹配。据我所知,在 SQL 中它看起来像这样:

SELECT * FROM TABLE WHERE COLUMN_1 LIKE "%string_1%" OR COLUMN_1 LIKE"%string_2%" ... OR COLUMN_2 LIKE "%string_1%" OR COLUMN_2 LIKE "%string_2%" ... ...

我在 MySQL 中尝试过,效果很好。然而,我不知道如何在 JPQL 中描述这一点。我能够传递多个值IN子句通过将命名参数设置为List, 如下:

 @Query("SELECT t FROM Table t WHERE TABLE_ID IN (:table_ids)")
public Page<Table> findByParameters(@Param("table_ids") List<Integer> table_ids, Pageable page)

我尝试用做同样的事情LIKE子句,但如果我传递超过 1 个值,我最终会得到 0 个结果。我面临着同样的问题LOCATE条款也是如此。

最坏的情况是,我可以设置一个适用于一个字符串的查询,并多次调用它,然后合并所有结果。然而,我非常愿意避免这种情况,因为它只不过是一个管道胶带解决方案。

我在网上寻找解决方案几个小时,但没有找到任何可以解决我的问题的内容。任何提示都将受到高度赞赏。

Thanks.


Because @Query需要在编译时使用 JPQL 进行修复,甚至本机查询都会使此类事情难以实现,尤其是以类型安全的方式实现。

所以我意识到您正在寻找 JPQL 解决方案,但这是一个学习和利用的绝佳机会Specification接口和 JPA 的 CriteriaQuery。这正是它的用途。

看一下以下存储库:

public interface Table1Repository            // to use specifications in queries 
        extends JpaRepository<Table1, Long>, JpaSpecificationExecutor<Table1> {

    @SuppressWarnings("serial")
    public static Specification<Table1> multiLikeColumn1(List<String> likePatterns) {
        return new Specification<Table1>() {
            @Override
            public Predicate toPredicate(Root<Table1> root, CriteriaQuery<?> query,
                                            CriteriaBuilder criteriaBuilder) {
                Path<String> column1 = root.get("column1");
                // create a Predicate for each "column1 like 'xy%az%' you need
                List<Predicate> predicates = likePatterns.stream()
                    .map(likePattern -> criteriaBuilder.like(column1, likePattern))
                    .collect(Collectors.toList());
                // then "concatenate" list of likes with "OR"
                return criteriaBuilder.or(predicates.toArray(new Predicate[]{}));
            }
        };
    }

}

它可能看起来有点复杂,但实际上当你熟悉它时并不复杂。用法很简单,例如:

@Resource
private Table1Repository repo;
repo.findAll(Table1Repository.multiLikeColumn1(Arrays.asList("%X%","%Z%")))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring Boot JPA:为同一参数传递多个值 (JPQL) 的相关文章

  • MYSQL:如何在同一查询中联接两个表,两次引用同一个表

    我有两张桌子 我正在尝试将下面的示例两个表与表 1 引用表 2 两次结合起来 例如 如果我查看表 1 组 2 和成员 7 它应该查找表 2 中的 ID 并给出输出 Group Members Name Name 2 7 Blue Dog T
  • 如何在 JSP 中导入类?

    我是一个完全的JSP初学者 我正在尝试使用java util List在 JSP 页面中 我需要做什么才能使用除以下类之外的类java lang 使用以下导入语句进行导入java util List 顺便说一句 要导入多个类 请使用以下格式
  • 内存一致性 - Java 中的happens-before关系[重复]

    这个问题在这里已经有答案了 在阅读有关内存一致性错误的 Java 文档时 我发现与创建 发生 之前 关系的两个操作相关的点 当语句调用时Thread start 每个具有 与该语句发生之前的关系也有一个 与 new 执行的每个语句之间发生的
  • 如何从 Retrofit2 获取字符串响应?

    我正在做 android 正在寻找一种方法来执行超级基本的 http GET POST 请求 我不断收到错误 java lang IllegalArgumentException Unable to create converter for
  • 重写 URL,将 ID 替换为查询字符串中的标题

    我对 mod rewrite 很陌生 但我做了一些搜索 但找不到这个问题的答案 我有一个网站 它只有一个 PHP 页面 根据查询字符串中传递给它的 ID 提供数十页内容 我想重写 URL 以便此 ID消失并替换为从数据库中提取的页面标题 例
  • 如何让spring为JdbcMetadataStore创建相应的schema?

    我想使用此处描述的 jdbc 元数据存储 https docs spring io spring integration docs 5 2 0 BUILD SNAPSHOT reference html jdbc html jdbc met
  • 如何在android中设置多个闹钟,在这种情况下最后一个闹钟会覆盖以前的闹钟

    我正在开发一个Android应用程序 用户可以在其中设置提醒时间 但我在以下代码中遇到一个问题 即最后一个警报会覆盖之前的所有警报 MainActivity java public void setreminders DatabaseHan
  • 如何将 android.net.Uri 转换为 java.net.URL? [复制]

    这个问题在这里已经有答案了 有没有办法从Uri to URL 我正在使用的库需要这个 它only接受一个URL但我需要在我的设备上使用图像 如果该方案的Uri is http or https new URL uri toString 应该
  • Java 8 中函数式接口的使用

    这是来自的后续问题Java 8 中的 双冒号 运算符 https stackoverflow com questions 20001427 double colon operator in java 8其中 Java 允许您使用以下方式引用
  • Git 无法识别重命名和修改的包文件

    我有一个名为的java文件package old myfile java 我已经通过 git 提交了这个文件 然后我将我的包重命名为new所以我的文件在package new myfile java 我现在想将此文件重命名 和内容更改 提交
  • 在 MySQL 数据库中保持 TEXT 字段唯一的最佳方法

    我想让 TEXT 字段的值在我的 MySQL 表中唯一 经过小型研究 我发现由于性能问题 每个人都不鼓励在 TEXT 字段上使用 UNIQUE INDEX 我现在想用的是 1 创建另一个字段来包含 TEXT 值的哈希值 md5 text v
  • 解析输入,除了 System.in.read() 之外不使用任何东西

    我很难找到具体的细节System in read 有效 也许有人可以帮助我 似乎扫描仪会更好 但我不允许使用它 我被分配了一个任务 我应该以 Boolean Operator Boolean 的形式读取控制台用户输入 例如T F 或 T T
  • 为什么java中的for-each循环中需要声明变量

    for 每个循环的通常形式是这样的 for Foo bar bars bar doThings 但如果我想保留 bar 直到循环结束 我可以not使用 foreach 循环 Foo bar null Syntax error on toke
  • Linux 上有关 getBounds() 和 setBounds() 的 bug_id=4806603 的解决方法?

    在 Linux 平台上 Frame getBounds 和 Frame setBounds 的工作方式不一致 这在 2003 年就已经有报道了 请参见此处 http bugs java com bugdatabase view bug do
  • 将图像添加到自定义 AlertDialog

    我制作了一个 AlertDialog 让用户可以从我显示的 4 个选项中选择一个 前 3 个让他们在单击号码时直接拨打号码 第 4 个显示不同的视图 现在看起来是这样的 由于第四个选项的目的是不同的任务 我想让它看起来不同 因为用户可能会感
  • 解决错误javax.mail.AuthenticationFailedException

    我不熟悉java中发送邮件的这个功能 我在发送电子邮件重置密码时遇到错误 希望你能给我一个解决方案 下面是我的代码 public synchronized static boolean sendMailAdvance String emai
  • Java:拆箱整数时出现空指针异常?

    此代码导致空指针异常 我不知道为什么 private void setSiblings PhylogenyTree node Color color throws InvalidCellNumberException PhylogenyTr
  • Android - 9 补丁

    我正在尝试使用 9 块图片创建一个新的微调器背景 我尝试了很多方法来获得完美的图像 但都失败了 s Here is my 9 patch 当我用Draw 9 patch模拟时 内容看起来不错 但是带有箭头的部分没有显示 或者当它显示时 这部
  • Hibernate 和可序列化实体

    有谁知道是否有一个框架能够从实体类中剥离 Hibernate 集合以使它们可序列化 我查看了 BeanLib 但它似乎只进行实体的深层复制 而不允许我为实体类中的集合类型指定实现映射 BeanLib 目前不适用于 Hibernate 3 5
  • 嵌入式 Jetty - 以编程方式添加基于表单的身份验证

    有没有一种方法可以按如下方式以编程方式添加基于表单的身份验证 我用的是我自己的LdapLoginModule 最初我使用基本身份验证并且工作正常 但现在我想在登录页面上进行更多控制 例如显示徽标等 有没有好的样品 我正在使用嵌入式 jett

随机推荐

  • Lumen - mongodb - jenssegers/laravel-mongodb - 邮递员

    我已经在我的wamp上安装了mongodb C wamp64 bin mongodb mongodb 3 4 bin 我在路径中添加了 mongodb 并创建 Windows 服务以在必要时启动它 我已经通过 Composer 安装了 lu
  • C++ 中的多维数组如何发挥作用? [复制]

    这个问题在这里已经有答案了 可能的重复 如何在 C 中使用数组 简而言之 C 中的多维数组是数组的数组 还是只是一个表现得像多维的数组 我的一位朋友解释说 C 中的数组只是常量指针 多维数组也是常量指针 其元素由多个索引寻址 即它们是指向一
  • 如何在 SQL 中选择重叠的日期范围

    我有一个包含以下列的表 sID 开始日期和结束日期 一些值如下 1 1995 07 28 2003 07 20 1 2003 07 21 2010 05 04 1 2010 05 03 2010 05 03 2 1960 01 01 201
  • java中的“>>>”是什么意思?

    我试图将此代码翻译为Python 但我很难这样做 不要担心索引值和变量名称 我只是想知道 gt gt gt 部分到底做了什么 也许是Python的等效项 但有一个解释就很好了 target 0 char source sourceIndex
  • 循环 tf.data.Dataset 非常慢

    我想知道为什么对 tf data Dataset 样本进行 for 循环比对相应的 numpy 数组进行循环要慢得多 import numpy as np import tensorflow as tf import time a np o
  • 如何在 Java 中从 List 转换为 double[]?

    我有一个这样的变量 List
  • 如何将 Next.js Link 与多个子项一起使用?

    如何使用Link在 Next js 中有多个 div 里面这个 div 我有 img 标签Link 链接的段落 链接的标题 错误 多个孩子被传递给href of article但只支持一个孩子https nextjs org docs me
  • 为什么 Xcode 中 Storyboard 的背景颜色没有改变?总是相同的灰色吗?

    因此 我已将故事板文件中默认视图的背景属性更改为与彩虹中的颜色一样多 颜色在 Xcode 中与我的按钮一起很好地显示 但是当我实际运行应用程序时 背景始终是与您从新 Xcode 项目开始时相同的 难看的 默认的灰色 Hello World
  • Cin.Ignore() 不起作用

    这里我有一个代码 cout lt lt Press Enter To Exit cin ignore 该程序将执行并等待 直到您按 Enter 键 然后它才会退出 现在看这段代码 int m cin gt gt m cout lt lt P
  • 自定义类加载器问题

    接下来的问题是 我从以下位置获取了基类加载器代码here 但我的类加载器在某种程度上是特定的 它必须能够从文件系统加载类 让我们以WinOS为例 所以在类加载器中必须有一些setAdditionalPath 方法 它设置一个路径 文件系统上
  • 将正确的 Gcode 字符串发送到串行端口?

    我正在尝试发送 gcodeg28通过线路连接到我的 RepRap 3D 打印机port Write g28 我的程序连接到正确的串行端口 但是当我尝试以字符串形式发送信息时 对 com 端口的访问被拒绝 这很奇怪 因为在向串行端口发送 Gc
  • 带有 utf-8 的 php substr() 函数在末尾留下 � 标记

    这是简单的代码
  • 动态 JSON 结构到 Java 结构

    我正在开发一个项目 使用 JSON 作为创建 Java 对象的配置框架 这也是我的第一个专业 Java 项目 来自多年的 CF PHP JS 等经验 我能找到的关于将 JSON 转换为 Java 的所有资源都基于这样的想法 您必须首先在 J
  • Neo4j 中的 64 位整数

    我在 Neo4j 文档中读到了一些地方 表明 Neo4j 支持 64 位整数 因此 我无法理解为什么我会得到大整数属性的舍入值 例如 CREATE t Test id 9223372036854775807 return t 结果是 id
  • AWS Lambda 创建函数 - 请求失败,状态代码为 403

    尝试创建新的 AWS Lambda 函数使用 root 帐户第一次使用管理控制台 我收到错误 请求失败 状态代码 403 无论我尝试了多少种不同的选择 我已经尝试更改我的区域 使用默认角色 基本 lambda 权限 新角色 现有角色以及选项
  • 如何在 iPhone 应用程序中运行时(以编程方式)切换 Wi-Fi 网络

    是否可以通过编程方式在 iPhone 应用程序中切换 WiFi 网络 在应用程序执行时 如果一个网络出现故障但仍处于连接状态 并且我想切换到另一个 Wi Fi 网络 这可能吗 您的 iPhone 应用程序不应管理 wifi 网络 如果是这样
  • Angular 2 - 将文本区域值发送到共享组件

    我在第一页中有一个文本区域 当我转到下一页时 我需要在下一页中共享的记事本组件中显示该值 但同时当我首先在共享组件中写入新信息时我需要该值并且可以保存和显示新信息 我需要使用 angular2 但无法使用 github 中的任何内容 在此处
  • IE8水平滚动条问题

    我有一个 IE8 错误的水平滚动条问题 与此类似 带溢出的 DIV auto 和 100 宽的表 不幸的是 那里建议的解决方案 缩放 1 在这里不起作用 或者我不知道如何申请 不应出现水平滚动条 它不会出现在 FF 或 Chrome 中但它
  • 在 rake 中调用 bash 别名

    我的 bashrc 中有以下命令 alias mfigpdf for FIG in fig do fig2dev L pdftex FIG FIG pdftex done for FIG in fig do fig2dev L pstex
  • Spring Boot JPA:为同一参数传递多个值 (JPQL)

    我正在使用 JPQL 在 JPA 中编写 SQL 查询CurdRepository界面 我能够使用命名参数编写多个查询 它们的工作方式就像一个魅力 但是 我的应用程序要求我将未知数量的字符串与表中的多个列进行匹配 据我所知 在 SQL 中它