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

时间:2016-06-11 01:24:42

标签: java spring hibernate jpa spring-data-jpa

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

问题是,由于lower(%:searchTerm%)子句中的WHERE表达式,Spring(或者它可能只是基础JPA提供程序,不确定)很难解析此查询。我也尝试了这种语法的其他变体,例如 %lower(:searchTerm)%,但到目前为止似乎都没有。对于这个人,有没有一个好的(最好是干净的)解决方案?

P.S。:为了保持一致性,我更倾向于使用@Query注释。但是,我猜其他解决方案(例如Spring的method name -> query派生或Criteria API)也是受欢迎的。

2 个答案:

答案 0 :(得分:4)

1)以小写方式将searchTerm注入方法,并使用JPQL ..... lower(COLUMN_NAME) like %:searchTerm%

2)使用具有以下命名语法的方法名称,因此不需要向JPQL %提供..... lower(COLUMN_NAME) :searchTerm

findBySearchTermContainingIgnoreCase(String searchTerm)
findBySearchTermStartingWithIgnoreCase(String searchTerm)

答案 1 :(得分:3)

尝试这样的事情:

@Query("SELECT u.username FROM User u WHERE u.username LIKE     
lower(CONCAT('%',:username,'%')"))
List<String> findUsersWithPartOfName(@Param("username") String username);

注意:JPQL中的表名必须以大写字母开头。