簡體   English   中英

Spring Data JPA-不區分大小寫的查詢,帶有模式匹配

[英]Spring Data JPA - case insensitive query w/ pattern matching

假設我正在為一個簡單的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);
}

問題是由於WHERE子句中的lower(%:searchTerm%)表達式,Spring(或者可能只是底層JPA提供程序,不確定)可能很難解析此查詢。 我也嘗試了這種語法的其他變體, 例如 %lower(:searchTerm)% ,但到目前為止似乎都沒有。 是否有人為此提供良好的解決方案(最好是干凈的解決方案)?

PS :出於一致性@Query我更願意使用@Query注釋。 但是,我猜也可以使用其他解決方案(例如Spring的method name -> query派生或Criteria API )。

1)將小寫的searchTerm注入該方法,然后使用JPQL ..... lower(COLUMN_NAME) like %:searchTerm%

2)使用具有以下命名語法的方法名稱,因此您無需向JPQL ..... lower(COLUMN_NAME) :searchTerm提供% ..... lower(COLUMN_NAME) :searchTerm

findBySearchTermContainingIgnoreCase(String searchTerm)
findBySearchTermStartingWithIgnoreCase(String searchTerm)

嘗試這樣的事情:

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

注意:JPQL中的表名稱必須以大寫字母開頭。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM