%Like Spring JpaRepository中的%Query

sud*_* cv 89 java jpa spring-data-jpa

我想写一个类似的查询,JpaRepository但它没有返回任何东西:

LIKE '%place%'- 没有用.

LIKE 'place' 工作得很好.

这是我的代码:

@Repository("registerUserRepository")
public interface RegisterUserRepository extends 
JpaRepository<Registration,Long>{

    @Query("Select c from Registration c where c.place like:place")
     List<Registration> findByPlaceContaining(@Param("place")String place);
}
Run Code Online (Sandbox Code Playgroud)

Hil*_*lle 175

spring数据JPA查询需要"%"字符以及like查询中的空格字符,如下所示

@Query("Select c from Registration c where c.place like %:place%").

参看 http://docs.spring.io/spring-data/jpa/docs/current/reference/html.

您可能希望完全删除@Query注释,因为它似乎类似于标准查询(由spring数据代理自动实现); 即使用单线

List<Registration> findByPlaceContaining(String place);
Run Code Online (Sandbox Code Playgroud)

足够了.

  • 使用以下命令忽略查询的大小写可能也很有用:findByPlaceIgnoreCaseContaining(String place); (21认同)
  • 谢谢你。我曾经用 `'` 写 `like '%:place%'` 并且根本没有结果,因为 Hibernate 自己将 `'` s 添加到字符串中。 (2认同)

Ale*_*NIS 84

你根本不需要@Query注释.

您可以使用以下内容

    @Repository("registerUserRepository")
    public interface RegisterUserRepository extends JpaRepository<Registration,Long>{

    List<Registration> findByPlaceIgnoreCaseContaining(String place);

    }
Run Code Online (Sandbox Code Playgroud)

  • 当我想使用多列时怎么办?- 我相信`@Query()` 是必须的,对吧?使用这种方法,我将不得不使 `or` 实际上不是适合这种情况的解决方案:`findByField1OrField2Containg(String phraseForField1, String phraseForField2)` (3认同)

ama*_*oor 23

您还可以使用Spring Data JPA支持的关键字"Containing"来实现类似的查询.

List<Registration> findByPlaceContaining(String place);
Run Code Online (Sandbox Code Playgroud)


Md.*_*rim 17

对于您的情况,您可以直接使用JPA方法.这就像吼叫:

包含:select ... like%:place%

List<Registration> findByPlaceContainingIgnoreCase(String place);
Run Code Online (Sandbox Code Playgroud)

在这里,IgnoreCase将帮助您忽略大小写来搜索项目.

以下是一些相关的方法:

  1. 喜欢 findByPlaceLike

    ...其中x.place喜欢?1

  2. 从...开始 findByPlaceStartingWith

    ...其中x.place喜欢?1(参数绑定附加%)

  3. EndingWith findByPlaceEndingWith

    ...其中x.place喜欢?1(参数绑定前置%)

  4. findByPlaceContaining

    ...其中x.place喜欢?1(参数绑定包装在%)

更多信息,请查看此链接此链接

希望对你有帮助 :)

  • 这是最新的方法。谢谢! (2认同)

小智 6

尝试这个。

@Query("Select c from Registration c where c.place like '%'||:place||'%'")
Run Code Online (Sandbox Code Playgroud)


Mat*_*bal 6

我用这个:

@Query("Select c from Registration c where lower(c.place) like lower(concat('%', concat(:place, '%')))")
Run Code Online (Sandbox Code Playgroud)

lower() 类似于 String 中的 toLowerCase,因此结果不区分大小写。


小智 5

您可以使用占位符的一种替代方法:

@Query("Select c from Registration c where c.place LIKE  %?1%")
List<Registration> findPlaceContainingKeywordAnywhere(String place);
Run Code Online (Sandbox Code Playgroud)