【问题标题】:Convert sql to JPA with a in-clause and a list of like使用 in-clause 和类似列表将 sql 转换为 JPA
【发布时间】:2022-01-12 03:53:58
【问题描述】:

我有一个如下的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 - 与大小为 [1,100] 的 user_id 完全匹配的字符串列表

nameList - 与字符 [A-Za-z0-9-_] 中大小为 [1,100] 的 first_name 或 last_name 同样匹配的字符串列表

名单示例:['Joe', 'Peter', 'White', 'XY']


我不知道如何处理类似部分的列表,而我所拥有的最接近的部分是没有类似列表

@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

【问题讨论】:

    标签: java jpa spring-data-jpa


    【解决方案1】:

    正则表达式查询可能是实现此目的的一种方法,如下所述: Searching multiple colums with a Contains query with a list of Items in Spring-Data 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_WS 加入提供的列表,例如 ('val1', 'val2', 'val3') 到正则表达式 'val1|val2|val3',这将匹配例如 'completeval2xxx'。)

    请注意,确切的 REGEXP / CONCAT_WS 函数取决于使用的 DB。

    【讨论】:

      【解决方案2】:

      假设意图是 name1name2 也是参数,你只需要完成你的 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% 绑定到两个占位符。

      【讨论】:

      • name1 和 name2 是要匹配的名称列表,不完全是 2。让我更新我的问题以使其更清楚
      • @hk6279 ...您不能将列表绑定到 SQL LIKE 表达式。
      • 如果JPA不可能做到,那么我可以做一个in子句,用java代码处理like子句。只是想在我转向 java 逻辑之前检查这是否可行。
      • 很难,因为IN不能和LIKE一起使用。
      猜你喜欢
      • 2020-11-19
      • 1970-01-01
      • 1970-01-01
      • 2012-01-18
      • 2012-09-29
      • 1970-01-01
      • 2021-11-24
      • 2021-04-19
      • 2020-01-21
      相关资源
      最近更新 更多