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 + "%");
我想按不区分大小写的名称搜索用户 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 + "%");