Spring Data JPA - 带模式匹配的不区分大小写的查询
Spring Data JPA - case insensitive query w/ pattern matching
假设我正在为一个简单的 CMS 包实现搜索功能(仅作为示例),并希望通过 title
和 content
来匹配帖子。据推测,我会有某种具有以下基础 table 结构的 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);
}
问题是 Spring(或者可能只是底层 JPA 提供程序,不确定)由于 WHERE
中的 lower(%:searchTerm%)
表达式很难解析此查询条款。我也尝试过此语法的其他变体,例如 %lower(:searchTerm)%
,但 none 似乎到目前为止有效。有人对此有好的(最好是干净的)解决方案吗?
P.S.:为了保持一致性,我更愿意使用 @Query
注释。但是,我想也欢迎其他解决方案(例如 Spring 的 method name -> query
推导或 Criteria API
)。
尝试这样的事情:
@Query("SELECT u.username FROM User u WHERE u.username LIKE
lower(CONCAT('%',:username,'%')"))
List<String> findUsersWithPartOfName(@Param("username") String username);
注意:JPQL中的table名称必须以大写字母开头。
1) 将已经小写的 searchTerm
注入方法,并使用 JPQL ..... lower(COLUMN_NAME) like %:searchTerm%
2) 使用具有以下命名语法的方法名称,因此您不需要向 JPQL %
..... lower(COLUMN_NAME) :searchTerm
findBySearchTermContainingIgnoreCase(String searchTerm)
findBySearchTermStartingWithIgnoreCase(String searchTerm)
假设我正在为一个简单的 CMS 包实现搜索功能(仅作为示例),并希望通过 title
和 content
来匹配帖子。据推测,我会有某种具有以下基础 table 结构的 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);
}
问题是 Spring(或者可能只是底层 JPA 提供程序,不确定)由于 WHERE
中的 lower(%:searchTerm%)
表达式很难解析此查询条款。我也尝试过此语法的其他变体,例如 %lower(:searchTerm)%
,但 none 似乎到目前为止有效。有人对此有好的(最好是干净的)解决方案吗?
P.S.:为了保持一致性,我更愿意使用 @Query
注释。但是,我想也欢迎其他解决方案(例如 Spring 的 method name -> query
推导或 Criteria API
)。
尝试这样的事情:
@Query("SELECT u.username FROM User u WHERE u.username LIKE
lower(CONCAT('%',:username,'%')"))
List<String> findUsersWithPartOfName(@Param("username") String username);
注意:JPQL中的table名称必须以大写字母开头。
1) 将已经小写的 searchTerm
注入方法,并使用 JPQL ..... lower(COLUMN_NAME) like %:searchTerm%
2) 使用具有以下命名语法的方法名称,因此您不需要向 JPQL %
..... lower(COLUMN_NAME) :searchTerm
findBySearchTermContainingIgnoreCase(String searchTerm)
findBySearchTermStartingWithIgnoreCase(String searchTerm)