我在查询表时需要小写所有电子邮件,但文档只为UPPER()
指定了method-name-keyowrd:
IgnoreCase findByFirstnameIgnoreCase ...其中UPPER(x.firstame)= UPPER(?1)
如何使用LOWER()
?
我调试了它,可以看出PredicateBuilder
似乎没有考虑它。
你知道这是否有限制?或者这可以用不同的方式实现吗?
答案 0 :(得分:1)
根据Spring JPA reference guide,findXXXByIgnoreCase(...)
默认使用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来查询数据库。