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

Spring Data JPA doesn't specify lower keyword in method names

我在查询 table 时需要将所有电子邮件小写,但文档仅指定了 UPPER():

的 method-name-keyowrd

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

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

您知道这是否是一个限制吗?或者这可以通过不同的方式实现吗?

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 来查询您的数据库。

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

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

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

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