使用LIKE和IgnoreCase的Spring Data CrudRepository @Query

时间:2016-11-01 08:39:18

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

我需要从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生成log:

  

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

3 个答案:

答案 0 :(得分:9)

试试这个

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

你试试这个语法:

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