[英]Spring Data JPA - case insensitive query w/ pattern matching
假设我正在为一个简单的CMS包实现搜索功能(仅作为示例),并希望通过title
和content
来匹配帖子。 大概,我将拥有某种带有以下基础表结构的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.