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
实体类,包含 id
、firstName
和 lastName
:
@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 项目
如果你在开发中遇到类似需求,不妨试试这个方法,省时又省力。