假设我正在为一个简单的 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);
}
问题是 Spring(或者可能只是底层 JPA 提供程序,不确定)由于 lower(%:searchTerm%)
很难解析此查询。 WHERE
中的表达式条款。我还尝试了此语法的其他变体,例如 %lower(:searchTerm)%
,但到目前为止似乎都不起作用。有人对此有好的(最好是干净的)解决方案吗?
P.S.:我更喜欢使用 @Query
为了保持一致性而进行注释。不过,我想其他解决方案(例如 Spring 的 method name -> query
派生或 Criteria API
)也是受欢迎的。
最佳答案
1) 将已经小写的 searchTerm
注入(inject)到方法中,并使用 JPQL ..... lower(COLUMN_NAME) like %:searchTerm%
2) 使用具有以下命名语法的方法名称,因此您不需要向 JPQL ..... lower(COLUMN_NAME ) :searchTerm
findBySearchTermContainingIgnoreCase(String searchTerm)
findBySearchTermStartingWithIgnoreCase(String searchTerm)
关于java - Spring Data JPA - 带模式匹配的不区分大小写的查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37759084/