假设我正在为简单的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);
}
问题是,由于lower(%:searchTerm%)
子句中的WHERE
表达式,Spring(或者它可能只是基础JPA提供程序,不确定)很难解析此查询。我也尝试了这种语法的其他变体,例如 %lower(:searchTerm)%
,但到目前为止似乎都没有。对于这个人,有没有一个好的(最好是干净的)解决方案?
P.S。:为了保持一致性,我更倾向于使用@Query
注释。但是,我猜其他解决方案(例如Spring的method name -> query
派生或Criteria API
)也是受欢迎的。
答案 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中的表名必须以大写字母开头。