使用LIKE Spring JPA @Query

Vik*_*iia 75 java sql jquery spring jpa

我正在尝试在CrudRepository中创建一个方法,它将能够为我提供用户列表,其用户名是LIKE输入参数(不仅以开头,还包含它).我尝试使用方法"findUserByUsernameLike(@Param("username") String username)"但是在Spring文档中告诉我,这个方法等于" where user.username like ?1".这对我来说并不好,因为我已经告诉我,我正试图让所有用户名包含的用户...

我写了一个查询方法,但它甚至没有部署.

@Repository
public interface UserRepository extends CrudRepository<User, Long> {

@Query("select u from user u where u.username like '%username%'")
List<User> findUserByUsernameLike(@Param("username") String username);
}
Run Code Online (Sandbox Code Playgroud)

任何人都可以帮我吗?

小智 141

尝试使用以下方法(它适用于我):

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

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

  • 或者`WHERE UPPER(u.username)LIKE CONCAT('%',UPPER(:username),'%')`进行不区分大小写的搜索 (10认同)

jmg*_*esc 107

使用方法名称创建查询,检查表4,它们解释了一些关键字.

  1. 使用Like:select ... like:username

    List<User> findByUsernameLike(String username);
    
    Run Code Online (Sandbox Code Playgroud)
  2. StartingWith:select ... like:username%

    List<User> findByUsernameStartingWith(String username);
    
    Run Code Online (Sandbox Code Playgroud)
  3. EndingWith:select ... like%:username

    List<User> findByUsernameEndingWith(String username);
    
    Run Code Online (Sandbox Code Playgroud)
  4. 包含:select ... like%:username%

    List<User> findByUsernameContaining(String username);
    
    Run Code Online (Sandbox Code Playgroud)

请注意,您要找的答案是4号.您不必使用@Query

  • 只是想补充一点,你也可以忽略大小写,如果需要,像这样:`List <User> findByUsernameContainingIgnoreCase(String username);` (10认同)

rem*_*_br 22

另一种方式:代替CONCAT函数我们可以使用双管:: lastname || '%'

@Query("select c from Customer c where c.lastName LIKE :lastname||'%'")
List<Customer> findCustomByLastName( @Param("lastname") String lastName);
Run Code Online (Sandbox Code Playgroud)

您可以放置​​任何位置,前缀,后缀或两者

:lastname ||'%'  
'%' || :lastname  
'%' || :lastname || '%'  
Run Code Online (Sandbox Code Playgroud)


小智 8

List<User> findByUsernameContainingIgnoreCase(String username);

为了忽略案件问题


Mír*_*íra 7

易于使用的代码(无需使用CONCAT或||):

@Query("from Service s where s.category.typeAsString like :parent%")
List<Service> findAll(@Param("parent") String parent);
Run Code Online (Sandbox Code Playgroud)

记录在:http : //docs.spring.io/spring-data/jpa/docs/current/reference/html


Md.*_*rim 5

对于您的情况,可以直接使用JPA方法。就像下面这样:

包含:选择...,例如%:username%

List<User> findByUsernameContainingIgnoreCase(String username);
Run Code Online (Sandbox Code Playgroud)

在这里,IgnoreCase将帮助您在不区分大小写的情况下搜索项目。

以下是一些相关方法:

  1. 喜欢 findByFirstnameLike

    …其中x.firstname像?1

  2. 从...开始 findByFirstnameStartingWith

    …其中x.firstname如?1(参数与附加%绑定)

  3. 结尾于 findByFirstnameEndingWith

    …其中x.firstname如?1(参数与前缀%绑定)

  4. 内含 findByFirstnameContaining

    …其中x.firstname如?1(参数绑定在%中)

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

希望能帮到你 :)