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

Spring Data JPA - case insensitive query w/ pattern matching

假设我正在为一个简单的 CMS 包实现搜索功能(仅作为示例),并希望通过 titlecontent 来匹配帖子。据推测,我会有某种具有以下基础 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)