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

标签 java spring hibernate jpa spring-data-jpa

假设我正在为一个简单的 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/

相关文章:

spring - 将 Spring Security 添加到现有的 Spring Web App(使用 JavaConfig)

java - 如何在 spring data elasticsearch 中添加 run-as header

java - 是否可以将 JPA 实体映射到存储过程(函数)?

java - 在 hibernate 中使用 ehcache 阻塞装饰器

java - 使用 Webdriver selenium 单击下一个列表元素 - Java

java - 排序功能不排序! java

java - 为什么以及在哪些情况下使用不同的类加载器两次加载 bean?

java - JPA - 如何使用实体继承中的 criteriaBuilder.construct 填充 DTO

java - 如何在 Hibernate 中加载子对象

Java递归-从数组中逆序整数,它是如何工作的?