我需要从 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 生成日志:
Hibernate: select user0_.name as 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: unexpected token: null near line ...
这工作正常但返回整个实体,这可能会产生很长的响应,因为我只需要检索特定字段:
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);
关于java - 带有 LIKE 和 IgnoreCase 的 Spring Data CrudRepository @Query,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40356565/