使用子句和类似列表将 sql 转换为 JPA
Convert sql to JPA with a in-clause and a list of like
我有一个 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 - 完全匹配 user_id 大小 [1,100]
的字符串列表
nameList - 在字符 [A-Za-z0-9-_ ]
中类似匹配 first_name 或 last_name 大小 [1,100] 的字符串列表
名单示例:['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);
子句参考:%Like% Query in spring JpaRepository
假设 name1
和 name2
也是参数,您只需要完成 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%
绑定到两个占位符。
正则表达式查询可能是实现此目的的一种方法,如下所述:
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_WS
加入提供的列表,例如 ('val1', 'val2', 'val3')
到正则表达式 'val1|val2|val3'
,这将匹配例如 'completeval2
xxx'。)
请注意,确切的 REGEXP / CONCAT_WS 函数取决于所使用的数据库。
我有一个 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 - 完全匹配 user_id 大小 [1,100]
的字符串列表nameList - 在字符 [A-Za-z0-9-_ ]
中类似匹配 first_name 或 last_name 大小 [1,100] 的字符串列表名单示例:['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);
子句参考:%Like% Query in spring JpaRepository
假设 name1
和 name2
也是参数,您只需要完成 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%
绑定到两个占位符。
正则表达式查询可能是实现此目的的一种方法,如下所述:
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_WS
加入提供的列表,例如 ('val1', 'val2', 'val3')
到正则表达式 'val1|val2|val3'
,这将匹配例如 'completeval2
xxx'。)
请注意,确切的 REGEXP / CONCAT_WS 函数取决于所使用的数据库。