繁体   English   中英

Spring Data JPA-不区分大小写的查询,带有模式匹配

[英]Spring Data JPA - case insensitive query w/ pattern matching

假设我正在为一个简单的CMS包实现搜索功能(仅作为示例),并希望通过titlecontent来匹配帖子。 大概,我将拥有某种带有以下基础表结构的Post实体:

+------------------------------------+
|               POST                 |
+---------+--------------+-----------+
| post_id | INTEGER      | NOT NULL, |
| title   | VARCHAR(255) | NOT NULL, |
| content | CLOB         | NOT NULL  |
+---------+--------------+-----------+

接下来,我将扩展Spring的JpaRepository并通过@Query注释添加搜索方法,就像这样(同样,只是一个示例):

public interface PostRepository extends JpaRepository<Post, Integer> {

    @Query("SELECT p FROM Post AS p WHERE lower(p.title) LIKE lower(%:searchTerm%)"  
            + " OR lower(p.content) LIKE lower(%:searchTerm%) ORDER BY p.title")
    List<Post> findBySearchTerm(@Param("searchTerm") String searchTerm);
}

问题是由于WHERE子句中的lower(%:searchTerm%)表达式,Spring(或者可能只是底层JPA提供程序,不确定)可能很难解析此查询。 我也尝试了这种语法的其他变体, 例如 %lower(:searchTerm)% ,但到目前为止似乎都没有。 是否有人为此提供良好的解决方案(最好是干净的解决方案)?

PS :出于一致性@Query我更愿意使用@Query注释。 但是,我猜也可以使用其他解决方案(例如Spring的method name -> query派生或Criteria API )。

1)将小写的searchTerm注入该方法,然后使用JPQL ..... lower(COLUMN_NAME) like %:searchTerm%

2)使用具有以下命名语法的方法名称,因此您无需向JPQL ..... lower(COLUMN_NAME) :searchTerm提供% ..... lower(COLUMN_NAME) :searchTerm

findBySearchTermContainingIgnoreCase(String searchTerm)
findBySearchTermStartingWithIgnoreCase(String searchTerm)

尝试这样的事情:

@Query("SELECT u.username FROM User u WHERE u.username LIKE     
lower(CONCAT('%',:username,'%')"))
List<String> findUsersWithPartOfName(@Param("username") String username);

注意:JPQL中的表名称必须以大写字母开头。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM