Spring Data JPA没有在方法名称中指定较低的关键字

时间:2016-03-11 12:50:30

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

我在查询表时需要小写所有电子邮件,但文档只为UPPER()指定了method-name-keyowrd:

IgnoreCase findByFirstnameIgnoreCase ...其中UPPER(x.firstame)= UPPER(?1)

如何使用LOWER()? 我调试了它,可以看出PredicateBuilder似乎没有考虑它。

你知道这是否有限制?或者这可以用不同的方式实现吗?

2 个答案:

答案 0 :(得分:1)

根据Spring JPA reference guidefindXXXByIgnoreCase(...)默认使用UPPER(...)来执行不区分大小写的搜索。

要强制它使用LOWER关键字,我们可以使用带有@Query注释的自定义查询并指定SELECT .... LOWER(email)= LOWER(?1)

在我的情况下,我使用了如下自定义查询来强制它使用LOWER列的email关键字:

@Query("SELECT p from Person p where LOWER(email) = LOWER(?1)")
List<Person> findByEmailIgnoreCase(@Param("email") String email);

这导致创建以下查询:

Hibernate: select person0_.id as id1_0_, person0_.email as email2_0_, person0_.first_name as first_na3_0_, person0_.last_name as last_nam4_0_ from person person0_ where lower(person0_.email)=lower(?)

这应该有助于查询使用函数索引,即LOWER(email)

答案 1 :(得分:0)

Spring Data JPA文档说明了关于属性的案例敏感性:

// Enabling ignoring case for an individual property
List<Person> findByLastnameIgnoreCase(String lastname);

// Enabling ignoring case for all suitable properties
List<Person> findByLastnameAndFirstnameAllIgnoreCase(String lastname, String firstname);

在方法名称中使用IgnoreCase将自动生成一个对一个或所有指定属性不区分的查询。

否则,您始终可以通过以下方式为其指定自定义查询:

@Query("select u from User u")
Stream<User> findAllByCustomQueryAndStream();

通过使用@Query注释,您可以使用普通的旧JPQL来查询数据库。