Spring CrudRepository中不区分大小写的查询

127

使用Spring CrudRepository Query时,我想选择具有“name”属性的“DeviceType”实体。但是以下查询会以区分大小写的方式选择实体。我该如何以不区分大小写的方式进行选择。谢谢。

public interface DeviceTypeRepository extends CrudRepository<DeviceType, Integer>, JpaSpecificationExecutor<DeviceType> {

    public Iterable<DeviceType> findByNameContaining(String name);

}  

23
你尝试过使用public Iterable<DeviceType> findByNameIgnoreCaseContaining(String name);吗? - Peter Keller
如果您对查询感兴趣,请尝试这个。在LIKE之后不需要加上'%'。<code> @Query(value= "select dt from DeviceType as dt where lower(dt.name) like lower(:name)")
public Iterable<DeviceType> anyMethodNameGoesHere(@Param(name) String name);</code>
- Java_Fire_Within
这可能会对您有所帮助,https://dev59.com/xloU5IYBdhLWcg3wu4ji#62988377 - Shashank
6个回答

250

正如 @Peter 在评论中提到的那样,只需添加 IgnoreCase

public interface DeviceTypeRepository 
    extends CrudRepository<DeviceType, Integer>, JpaSpecificationExecutor<DeviceType> {

    public Iterable<DeviceType> findByNameContainingIgnoreCase(String name);
}  

请查看文档以获取方法名称内所有支持的关键字列表。


非常感谢您的回答。我一定会参考那篇文档。非常感谢,祝您度过愉快的时光! - Channa
3
它对我有用。我正在使用JPA查询。根据文档,WHERE UPPER(x.firstname) = UPPER(?1)是有效的。 - sunitha
@sunitha,你知道我们可以修改这个行为的任何方法吗?比如说,将它改为小写?我的数据库是基于小写的索引。 - Sudip Bhandari
@SudipBhandari:当然可以。 - sunitha
3
若要查找多个属性,请像这样重复使用 IgnoreCaseList<Account> findByUsernameIgnoreCaseAndDomainIgnoreCase(String username, String domain); - Tarator
显示剩余5条评论

13
以下的Spring Data Mongo查询对我来说是有效的。我更喜欢使用List而不是Iterator
public interface DeviceTypeRepository extends CrudRepository<DeviceType,Integer>, JpaSpecificationExecutor<DeviceType> {
    List<DeviceType> findByNameIgnoreCase(String name);
} 

2
在我的情况下,添加IgnoreCase根本没有起作用。
我发现可以为正则表达式提供选项:
@Query(value = "{'title': {$regex : ?0, $options: 'i'}}")
Foo findByTitleRegex(String regexString);
选项使查询不区分大小写。

2

对于那些使用自定义 JPA 查询的人,Upper 关键字和 toUpperCase 很有帮助。以下代码适用于我:

 return  entityManager.createQuery("select q from "table " q  where upper(q.applicant)=:applicant")
    .setParameter("applicant",applicant.toUpperCase().trim()).getSingleResult();

1
使用'upper(q.applicant)'时要小心。在Postgres中,当q.applicant为空时,会导致'.PSQLException: ERROR: function upper(bytea) does not exist'的错误。 - advortsov

0
虽然我认为已经提供的答案带来了一些有用的信息,但我也认为它们还不够。
Spring Data JPA的查询构建/生成机制解析了在自定义存储库接口中显式声明(由开发人员)的方法名称(这些接口扩展了CrudRepository或其任何子类型),并基于这些名称为相应的后备数据存储/数据库生成本地查询。
假设我们有一个被管理的类型(即@Entity)Person,如下所示:
class Person {
    @Id
    private Integer id;
    private String firstname;
    private String lastname;
    private Integer age;
    
    //getters, setters, constructor, etc.
}

和一个对应的存储库,与该实体配合使用:

interface PersonRepository<Person, Integer> {
}

为了指示Spring Data JPA忽略作为用户声明的存储库方法参数提供的值的大小写,您可以使用以下方法:
1. `IgnoreCase` - 用于忽略特定字段的大小写敏感性; 2. `AllIgnoreCase` - 用于忽略所有字段的大小写敏感性。
请注意,虽然您应该将`IgnoreCase`放在要忽略大小写敏感性的字段之后,但几乎可以将`AllIgnoreCase`放在您声明的方法名称的任何位置。
针对特定字段/列忽略大小写敏感性:
忽略`firstname`和`lastname`值的大小写敏感性:
List<Person> findByFirstnameIgnoreCaseAndLastnameIgnoreCase(String firstname, String lastname);

忽略lastname值的大小写。
List<Person> findByFirstnameAndLastnameIgnoreCase(String firstname, String lastname);

忽略firstname值的大小写。
List<Person> findByFirstnameIgnoreCaseAndLastname(String firstname, String lastname);

忽略所有字段/列的大小写敏感性:

在任何参数名称之前加上AllIgnoreCase

List<Person> findByAllIgnoreCaseFirstnameAndLastname(String firstname, String lastname);

或者仅在某些参数名称之后:
List<Person> findByFirstnameAllIgnoreCaseAndLastname(String firstname, String lastname);

或者最后,在所有参数名称之后:
List<Person> findByFirstnameAndLastnameAllIgnoreCase(String firstname, String lastname);

甚至在一开始,将findBy与之交换:
List<Person> AllIgnoreCaseFirstnameAndLastname(String firstname, String lastname);

所有这些都会导致相同的行为 - 在生成查询时忽略大小写敏感性,适用于所有字段/列。

0
在我的情况下,添加 IgnoreCase 的作用如下。我更喜欢使用 list 而不是 iterator
public List<ContactEntity> findByNameIgnoreCaseContainingAndUserEntity(String name, UserEntity userEntity);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接