【问题标题】:Spring Data CrudRepository @Query With LIKE and IgnoreCaseSpring Data CrudRepository @Query 与 LIKE 和 IgnoreCase
【发布时间】:2017-03-14 09:14:49
【问题描述】:

我需要从 CrudRepository 中检索一些 Entity 字段:

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:意外令牌:行附近为空...

这工作正常,但返回整个实体,可能会产生长响应,因为我只需要检索特定字段:

List<User> findByNameStartingWithIgnoreCase(String match);

【问题讨论】:

  • 当您询问错误时,请始终发布准确且完整的错误消息和堆栈跟踪。当询问一些不起作用的事情时,请始终说明您期望发生什么,以及会发生什么。
  • 如果返回空列表,并且您将"match%" 作为参数传递给该方法,则仅表示没有用户的名称以“匹配”开头。
  • 不,我实现了这样的不区分大小写的服务,它工作正常,问题出在第二个 LOWER() - ... LIKE LOWER(?1)
  • 你将什么作为参数传递给方法,表格包含什么?

标签: java spring-data spring-data-jpa


【解决方案1】:

试试这个

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

【讨论】:

    【解决方案2】:

    如果您需要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);
    

    【讨论】:

      【解决方案3】:

      你试过这个语法吗:

      @Query("SELECT U.name FROM User U WHERE LOWER(U.name) LIKE LOWER(?1)%") 并且只需给出名称或名称的开头

      【讨论】:

      • 我试过了,但它会产生 org.hibernate.hql.internal.ast.QuerySyntaxException: 意外令牌:第 1 行第 104 列附近的空值
      猜你喜欢
      • 1970-01-01
      • 2020-11-26
      • 2015-06-19
      • 2014-08-31
      • 2018-12-10
      • 2022-01-13
      • 1970-01-01
      • 2015-12-25
      • 2017-06-23
      相关资源
      最近更新 更多