当前位置: 首页 > 知识库问答 >
问题:

使用in子句和类似列表将sql转换为JPA

唐阳泽
2023-03-14

我有一个sql语句如下,想将其转换为JPA

SELECT * FROM employee
where user_id in ('id1', 'id2', 'id3')
AND (
    first_name like '%name1%' OR last_name like '%name1%'
    OR
    first_name like '%name2%' OR last_name like '%name2%'
    )
ORDER BY user_id ASC;

输入参数

userIdList-与大小为[1100]的user\u id完全匹配的字符串列表

nameList-一个字符串列表,用于在字符[a-Za-z0-9-\u2]中精确匹配大小为[1100]的first\u name或last\u name

姓名列表示例:[“Joe”、“Peter”、“White”、“X Y”]

我不知道如何处理相似部分的列表,最近的一次是没有相似部分的列表

@Modifying
@Query(value = "select * from employee where user_id IN :ids ORDER BY user_id",
            nativeQuery = true)
List<UserGroupTable> findAllByUserIdList(@Param("ids") List<String> userIdList);

In子句引用:%Like%在spring JpaRepository中查询

共有2个答案

强金鑫
2023-03-14

假设意图是将名称1和名称2也作为参数,那么您只需完成JPA查询:

select *
from employee
where user_id IN :ids and (
      first_name like :name1 or last_name like :name1 or
      first_name like :name2 or last_name like :name2)
order by user_id

更新的Java方法:

@Modifying
@Query(value = "select * from employee where user_id IN :ids and (first_name like :name1 or last_name like :name1 or first_name like :name2 or last_name like :name2) order by user_id",
    nativeQuery = true)
List<UserGroupTable> findAllByUserIdList(@Param("ids") List<String> userIdList, @Param("name1") String name1, @Param("name2") String name2);

请注意,您绑定到: name1: name2实际的通配符表达式。例如,对于John Doe的名称,您将绑定%John%%Doe%到两个占位符。

申光临
2023-03-14

regex查询可能是实现这一点的一种方法,如下所述:使用包含Spring数据JPA中项目列表的查询来搜索多个列

MariaDB MySQL示例:

@Query(nativeQuery = true, value = "SELECT * FROM my_entity WHERE "
      + "first_name REGEXP CONCAT_WS('|', :nameslist) " + "OR "
      +  "last_name REGEXP CONCAT_WS('|', :nameslist) ")
    List<MyEntity> findByNames( // (method name does not matter)
                     @Param("nameslist") Collection<String> nameslist);

CONCAT\u WS将提供的列表,例如,('val1','val2','val3')连接到正则表达式'val1 | val2 | val3',该正则表达式将匹配例如'completeval2xxx'

请注意,确切的REGEXP/CONCAT\u WS函数取决于使用的数据库。

 类似资料:
  • 问题内容: 我想用类似SQL的子句过滤Pyspark DataFrame ,如 元组在哪儿?我收到此错误: java.lang.RuntimeException:[1.67]错误:预期“(”,但找到了标识符 这基本上是说它期待的是 ‘(1,2,3)’ 而不是a。问题是由于从另一个作业中提取了值,因此我无法手动将其写入。 在这种情况下,我该如何过滤? 问题答案: 您传递给它的字符串是在SQL环境范围

  • 问题内容: 我通过执行查询得到。这必须传递给 IN 子句值的另一个查询。如何通过 HQL ? 我们可以转换到并且可以通过它,这不是一个问题。 最后,我必须将列表以或或形式传递给 IN 子句。 问题答案: 要么

  • 问题内容: 在SQL中,有什么方法可以缩短语法 到 一次又一次地在子句中写入相同的列名是不可行的。 问题答案: 没有没有办法将LIKE与IN 直接 结合 __ 有很多解决方法,例如本例中的SQL Server 这会将多个OR搜索条件更改为行和JOIN 或者,您可以使用UNION将多个查询合并为一个

  • 问题内容: 关闭。 此问题不符合堆栈溢出准则。它当前不接受答案。 想要改善这个问题吗? 更新问题,使它成为Stack Overflow的主题。 2年前关闭。 改善这个问题 我正在使用大量SQL表在Web应用程序中工作。我需要为每个表创建一个Java bean类。我正在寻找一种可以将SQL表转换为Java Bean类的工具。这将有助于节省时间。 这是一个例子: studentTable(studen

  • 问题内容: 我已经让用户在表中输入需要查询的值列表。该列表可能非常大,并且在编译时长度未知。而不是使用我在想的是,使用临时表并对其执行联接会更有效。我在另一个SO问题中阅读了此建议(目前无法找到,但在编辑时会进行编辑)。 要点是这样的: 如果我有两个同时进行,如果线程2尝试在线程1之后创建TEMP表,我不会收到错误消息吗? 我应该为TEMP表随机生成一个名称吗? 或者,如果我将整个内容包装在交易中

  • 问题内容: 例如,假设你有两个类: 我有一个返回a的方法,List 并且我想将列表中的所有对象都强制转换为,TestB以便最终得到 问题答案: 简单地铸造几乎可行;但这是行不通的,因为你不能将一个参数的泛型类型转换为另一个参数。但是,你可以强制转换中间通配符类型,并且将允许它(因为你可以强制转换为通配符类型或从通配符类型强制转换,只是带有未选中的警告):