java - 带有 LIKE 和 IgnoreCase 的 Spring Data CrudRepository @Query

标签 java spring-data spring-data-jpa

我需要从 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/

相关文章:

java - 选项卡未调用 onCreateView

java - 用于MainActivity和广播接收器之间通信的接口(interface)

java - 在事务中转换实体时出现 LazyInitializationException

java - 具有 JPA 持久性的 Spring 状态机 - 存储库使用

java - Springboot Jpa更新记录而不是插入

java - 为什么此代码会错误地报告我的 Android 设备上的可用空间?

java - 如何使用Spring JPA查询名称约定来查询通配符

java - Spring-data-redis @Cacheable java.lang.ClassCastException : java. util.LinkedHashMap 无法转换为 MyObject

java - 无法为方法 public Abstract java.util.Optional 创建查询元模型

java - spring:在每个 Controller 模型中添加 session 属性