Spring Data CrudRepository @Query 带有 LIKE 和 IgnoreCase

问题描述 投票:0回答:4

我需要从 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_ 中选择 user0_.name 作为 col_0_0_,其中 lower(user0_.name) 像 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);
java spring-data spring-data-jpa
4个回答
18
投票

试试这个

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

5
投票

如果您需要格式

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);

0
投票

你尝试一下这个语法吗:

@Query("从用户 U 中选择 U.name,其中 LOWER(U.name) LIKE LOWER(?1)%") 只需给出名称或名称的开头


0
投票

如果你有ascii字符,它就不起作用

© www.soinside.com 2019 - 2024. All rights reserved.