JPQL喜欢Case Insensitive

时间:2016-05-12 06:06:34

标签: java spring jpa spring-data-jpa jpql

我希望按名称不区分大小写在User表中搜索数据。

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

  @Query("select u from User u where lower(u.name) like %lower(?1)%")
  public List<User> findByNameFree(String name);

}

我收到了一条错误消息:意外令牌:%。我应该在哪里放置'%'?

4 个答案:

答案 0 :(得分:45)

您可以使用concat运算符:

@Query("select u from User u where lower(u.name) like lower(concat('%', ?1,'%'))")
public List<User> findByNameFree(String name);

或使用命名参数:

@Query("select u from User u where lower(u.name) like lower(concat('%', :nameToFind,'%'))")
public List<User> findByNameFree(@Param("nameToFind") String name);

(使用Spring Boot 1.4.3测试)

答案 1 :(得分:14)

如果这只是您想要的,并且您使用的是Spring Data JPA,则无需编写查询。

List<User> findByNameContainingIgnoreCase(String name);

否则,在将name属性传递给方法之前,需要将%属性包装在TestProvider中(将这些属性直接放入查询中将无法正常工作)。或者,不要使用查询,而是使用规范或Criteria API来创建查询。

答案 2 :(得分:3)

我正在使用Spring Boot 2.1.6,您可以使用Containing,Contains和IsContaining定义查询方法,如下所示:

List<User> findByNameContaining(String name);
List<User> findByNameContains(String name);
List<User> findByNameIsContaining(String name);

不区分大小写:

List<User> findByNameContainingIgnoreCase(String name);

或者您也可以定义如下:

@Query("select u from User u where lower(u.name) like lower(concat('%', :name,'%'))")
public List<User> findByName(@Param("name") String name);

@Param批注在这里很重要,因为我们使用的是命名参数。

答案 3 :(得分:0)

您可以使用wildcard matching

例如,我想搜索haha

之类的名称
@Query("select u from User u where lower(u.name) like :u_name")
public List<User> findByNameFree(@Param("u_name") String name);
List<User> users = userDao.findByNameFree("%haha");
相关问题