JPQL喜欢Case Insensitive

我想在用户表中按名称不区分大小写搜索数据。

@Repository public interface UserRepository extends JpaRepository { @Query("select u from User u where lower(u.name) like %lower(?1)%") public List findByNameFree(String name); } 

我收到一个错误: 意外的令牌:% 。 我应该在哪里放’%’?

您可以使用concat运算符:

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

或者使用命名参数:

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

(使用Spring Boot 1.4.3测试)

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

 List findByNameContainingIgnoreCase(String name); 

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

您可以使用wildcard matching

例如,我想搜索像haha这样的名字,

 @Query("select u from User u where lower(u.name) like :u_name") public List findByNameFree(@Param("u_name") String name); List users = userDao.findByNameFree("%haha");