1. 概述

Spring Data JPA 的查询默认是区分大小写的。也就是说,字段值的比较是基于大小写敏感的规则进行的。

本文将带你了解如何在 Spring Data JPA 中快速实现不区分大小写的查询,适用于常见的实体字段检索场景。


2. 依赖配置

首先确保你的 pom.xml 中包含以下依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
    <version>3.3.2</version>
</dependency>
<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <scope>runtime</scope>
    <version>2.1.214</version>
</dependency>

这些是构建 Spring Data JPA 应用的基础依赖,H2 是一个轻量的内存数据库,适合用于测试和开发。


3. 初始设置

我们定义一个简单的 Passenger 实体类,包含 idfirstNamelastName

@Entity
class Passenger {
 
    @Id
    @GeneratedValue
    @Column(nullable = false)
    private Long id;
 
    @Basic(optional = false)
    @Column(nullable = false)
    private String firstName;
 
    @Basic(optional = false)
    @Column(nullable = false)
    private String lastName;
 
    // constructor, static factory, getters, setters
}

接着,在测试类中初始化一些测试数据:

@DataJpaTest
@RunWith(SpringRunner.class)
public class PassengerRepositoryIntegrationTest {

    @PersistenceContext
    private EntityManager entityManager;
    @Autowired
    private PassengerRepository repository;

    @Before
    public void before() {
        entityManager.persist(Passenger.from("Jill", "Smith"));
        entityManager.persist(Passenger.from("Eve", "Jackson"));
        entityManager.persist(Passenger.from("Fred", "Bloggs"));
        entityManager.persist(Passenger.from("Ricki", "Bobbie"));
        entityManager.persist(Passenger.from("Siya", "Kolisi"));
    }
    
    //...
}

4. 使用 IgnoreCase 实现不区分大小写的查询

假设我们要根据 firstName 进行不区分大小写的查询,可以这样做:

@Repository
public interface PassengerRepository extends JpaRepository<Passenger, Long> {
    List<Passenger> findByFirstNameIgnoreCase(String firstName);
}

关键点: Spring Data JPA 提供了关键字 IgnoreCase,用于自动构建不区分大小写的查询语句。

我们可以编写一个 JUnit 测试来验证效果:

@Test
public void givenPassengers_whenMatchingIgnoreCase_thenExpectedReturned() {
    Passenger jill = Passenger.from("Jill", "Smith");
    Passenger eve = Passenger.from("Eve", "Jackson");
    Passenger fred = Passenger.from("Fred", "Bloggs");
    Passenger siya = Passenger.from("Siya", "Kolisi");
    Passenger ricki = Passenger.from("Ricki", "Bobbie");

    List<Passenger> passengers = repository.findByFirstNameIgnoreCase("FrED");

    assertThat(passengers, contains(fred));
    assertThat(passengers, not(contains(eve)));
    assertThat(passengers, not(contains(siya)));
    assertThat(passengers, not(contains(jill)));
    assertThat(passengers, not(contains(ricki)));
}

⚠️ 注意: 传入的是 "FrED",但依然能匹配到 firstName = "Fred" 的记录,说明大小写不影响查询结果。


5. 总结

通过使用 findByFirstNameIgnoreCase 方法,我们可以简单粗暴地实现 Spring Data JPA 中的不区分大小写的查询。

✅ 优点:

  • 无需手动编写 JPQL 或 SQL
  • 语法简洁,易于维护
  • 可直接用于 Spring Boot 项目

如果你在开发中遇到类似需求,不妨试试这个方法,省时又省力。


原始标题:Case Insensitive Queries with Spring Data Repository | Baeldung