簡體   English   中英

Spring Data CrudRepository @Query 與 LIKE 和 IgnoreCase

[英]Spring Data CrudRepository @Query With LIKE and IgnoreCase

我需要從 CrudRepository 檢索一些實體字段:

public class User {
    private String name;

    // getters and setters
}

public interface UserRepository extends CrudRepository<User, Long> { 

   @Query("SELECT U.name FROM User U WHERE LOWER(U.name) LIKE LOWER(?1)")
   List<String> findByName(String matchPhrase);
}

基本上,我想獲得等效的 SQL 查詢:

SELECT u.name FROM user u WHERE LOWER(u.name) LIKE LOWER('match%')

問題是@Query 不起作用(返回空列表),hibernate 生成日志:

休眠:選擇 user0_.name 作為 col_0_0_ from user user0_ where lower(user0_.name) like lower(?)

我實際上不知道如何指定附加了 % 的參數。

// also fails at compile-time
@Query("SELECT U.name FROM User U WHERE LOWER(U.name) LIKE LOWER(?1%)")

org.hibernate.hql.internal.ast.QuerySyntaxException:意外標記:空近線...

這工作正常,但返回整個實體,這可能會產生長響應,因為我只需要檢索特定字段:

List<User> findByNameStartingWithIgnoreCase(String match);

試試這個

@Query("SELECT U.name FROM User U WHERE LOWER(U.name) LIKE LOWER(concat(?1, '%'))")
List<String> findByName(String matchPhrase);

如果您需要like %name% (而不是like name%like name%的格式,您可以按如下方式擴展接受的答案:

@Query("SELECT U.name FROM User U WHERE LOWER(U.name) LIKE LOWER(concat('%', concat(?1, '%')))")
List<String> findByName(String matchPhrase);

你有沒有試過這個語法:

@Query("SELECT U.name FROM User U WHERE LOWER(U.name) LIKE LOWER(?1)%") 並給出名稱或名稱的開頭

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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