JPQL 不区分大小写

JPQL Like Case Insensitive

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

@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);

}

我收到一个错误:意外标记:%。我应该把“%”放在哪里?

您可以使用 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");

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

List<User> findByNameContainingIgnoreCase(String name);

否则,在将 name 属性传递给方法之前,您需要用 % 包装它(将它们直接放在查询中根本行不通)。或者不使用查询,而是使用规范或条件 API 来创建查询。

您可以使用连接运算符:

@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 测试)

我正在使用 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 注释在这里很重要,因为我们使用的是命名参数。

不使用 concat 和使用 TypedQuery:

  TypedQuery<Baptism> query = entityManager.createQuery("SELECT d FROM " + Baptism.class.getSimpleName()
                            + " d JOIN d.person p WHERE UPPER(p.lastName) LIKE UPPER(:ln)", Baptism.class);
                    query.setParameter("ln", "%" + ln + "%");