簡體   English   中英

JPQL 類似大小寫不敏感

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM