[英]JPQL Like Case Insensitive
我想按名稱不區分大小寫搜索用戶表中的數據。
@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);
}
我收到一個錯誤:意外令牌:% 。 我應該把“%”放在哪里?
您可以使用 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 測試)
如果這只是您想要的並且您正在使用 Spring Data JPA,則不需要編寫查詢。
List<User> findByNameContainingIgnoreCase(String name);
否則,您需要在將name
屬性傳遞給方法之前用%
包裝它(將它們直接放在查詢中將根本不起作用)。 或者不使用查詢,而是使用規范或 Criteria API 來創建查詢。
我使用的是 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 + "%");
您可以使用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");
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.