有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

JavaSpringDataJPA没有在方法名称中指定lower关键字

查询我的表时,我需要将所有电子邮件小写,但文档仅为UPPER()指定了方法名keyowrd:

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

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

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


共 (2) 个答案

  1. # 1 楼答案

    Spring Data JPA docs对房产的区分大小写进行了说明:

    // 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来查询数据库

  2. # 2 楼答案

    根据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)