[英]Spring Data JPA - case insensitive query w/ pattern matching
假設我正在為一個簡單的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);
}
問題是由於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.