Spring JPA@Query with LIKE

我试图在 CrudRepository 中创建一个方法,它能够给我一个用户列表,这些用户的用户名与输入参数类似(不仅以输入参数开头,还包含它)。我尝试使用方法 "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);
}

有人能帮我吗?

162395 次浏览
@Query("select u from user u where u.username LIKE :username")
List<User> findUserByUsernameLike(@Param("username") String username);

尝试使用以下方法(对我来说很有效) :

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

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

另一种方法是: 取代 CONCAT函数,我们可以使用双管道: 校对: lastname | | “%”

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

您可以放在任何地方,前缀,后缀或两者兼而有之

:lastname ||'%'
'%' || :lastname
'%' || :lastname || '%'

使用 从方法名称创建查询检查表4,其中解释了一些关键字。

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

     List<User> findByUsernameLike(String username);
    
  2. select ... like :username%开始

     List<User> findByUsernameStartingWith(String username);
    
  3. EndingWith: select ... like %:username

     List<User> findByUsernameEndingWith(String username);
    
  4. 内含: select ... like %:username%

     List<User> findByUsernameContaining(String username);
    

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

@Query("select b.equipSealRegisterId from EquipSealRegister b where b.sealName like %?1% and b.deleteFlag = '0'" )
List<String>findBySeal(String sealname);

我已经试过这个代码,它的工作原理。

List<User> findByUsernameContainingIgnoreCase(String username);

为了忽略案子的问题

易于使用(不需要使用 CONCAT 或 | |) :

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

Documented in: http://docs.spring.io/spring-data/jpa/docs/current/reference/html.

For your case, you can directly use JPA methods. That is like bellow:

包含: select... like% : username%

List<User> findByUsernameContainingIgnoreCase(String username);

在这里,无视 Case将帮助您搜索项目与忽略的情况下。

以下是一些相关的方法:

  1. 就像 findByFirstnameLike

    ... 在哪里 X。名字喜欢? 1

  2. findByFirstnameStartingWith开始

    ... 其中 x.firstname 类似于? 1(参数与附加的% 绑定)

  3. 结尾与 findByFirstnameEndingWith

    ... 其中 x.firstname 类似于? 1(参数与前缀% 绑定)

  4. findByFirstnameContaining

    ... 其中 x.firstname 类似? 1(参数绑定在% 中)

更多信息,请查看 这个链接这个链接

希望这个能帮到你:)

这种方法对我很有效(使用 Spring Boot version 2.0.1. RELEASE) :

@Query("SELECT u.username FROM User u WHERE u.username LIKE %?1%")
List<String> findUsersWithPartOfName(@Param("username") String username);

解释: 什么?1?2?3等是位置持有人的第一,第二,第三参数等。在这种情况下,参数被% 包围就足够了,就好像它是一个标准的 SQL 查询,但是没有单引号。

您在 username 参数之前遗漏了一个冒号(:)。因此您的代码必须从以下位置更改:

@Query("select u from user u where u.username like '%username%'")

致:

@Query("select u from user u where u.username like '%:username%'")

这个 @Query("select u from user u where u.username like '%:username%'")在某些情况下不工作!

对我来说有效的解决办法是

@Query("SELECT u.username FROM User u WHERE u.username LIKE CONCAT('%',:username,'%')")

如果您正在使用 Spring-Data-Jpa + 2.7,那么在查询中使用% : param% 的 LIKE 参数有一个 bug。它将在版本3中修复。

Https://github.com/spring-projects/spring-data-jpa/issues/2548