Spring Data JPA 的“方法名派生查询”功能(Query Method Name Derivation)是在 repository/ 层中使用的,它是 Spring Data JPA 的核心优势之一,可以让你不用写一行 SQL,就能实现数据库查询操作。即:Spring Data 的 派生查询(Derived Query)是一种通过方法名约定自动生成数据库查询的机制,无需手动编写 SQL。
Spring Data JPA 的 “方法名派生查询” 功能(Query Method Name Derivation) 是在 repository/ 层中使用的,它是 Spring Data JPA 的核心优势之一,可以让你不用写一行 SQL,就能实现数据库查询操作。即:Spring Data 的 派生查询(Derived Query)是一种通过方法名约定自动生成数据库查询的机制,无需手动编写 SQL。
方法名派生查询功能的使用位置
在 repository/ 里
1 | public interface UserRepository extends JpaRepository<UserEntity, Long> { |
方法名解析规则
Spring Data 根据 方法名的结构 解析出查询逻辑,生成对应的数据库查询。步骤:
- 拆分方法名:以 findBy、existsBy、deleteBy 等关键字为分隔符,提取查询条件。
- 解析属性路径:将方法名中的属性名(如 name)映射到实体类的字段。
- 识别操作符:通过关键字(如 And、Or、LessThan)确定查询条件的关系和操作。
方法命名规范
1 | <动词><By><属性名1><关键词><属性名2><排序> |
举例:
1 | List<User> findByUsernameAndStatusOrderByAgeDesc(); |
findBy: 查询动词
UsernameAndStatus: 查询条件字段
OrderByAgeDesc: 排序规则
动词
| 前缀 | 说明 |
|---|---|
| find…By / get…By / read…By / query…By / search…By / stream…By | 通用查询方法通常返回储存库类型,Collection或Streamable子类型或结果包装器,例如Page,GeoResults或任何其他特定于商店的结果包装器。可用作findBy...,findMyDomainTypeBy...或其他关键字结合使用。 |
| exists…By | 是否存在,返回 boolean |
| count…By | 统计数量 |
| delete…By / remove…By | 删除查询方法返回无结果(void)或删除计数。 |
| …First |
将查询结果限制为第一个<number>结果。此关键字可以出现在主题的find(和其他关键字)和之间的任何位置by。 |
| …Distinct… | 使用不同的查询仅返回唯一的结果。查阅特定于商店的文档是否支持该功能。此关键字可以出现在主题的find(和其他关键字)和之间的任何位置by。 |
条件关键字(字段之间连接)
| 关键字 | 说明 | 示例 |
|---|---|---|
| And | 且 | findByUsernameAndStatus |
| Or | 或 | findByUsernameOrEmail |
| Between | 范围 | findByAgeBetween(int min, int max) |
| LessThan / GreaterThan | 小于 / 大于 | findByAgeGreaterThan(int age) |
| Before / After | 时间前 / 时间后 | findByCreatedAtAfter(Date date) |
| IsNull / IsNotNull | 判空 | findByEmailIsNull() |
| Like | 模糊匹配(需加 %) | findByUsernameLike(“%admin%”) |
| Containing | 包含(自动加 %) | findByUsernameContaining(“adm”) |
| StartingWith / EndingWith | 前缀 / 后缀匹配 | findByUsernameStartingWith(“a”) |
| In / NotIn | 在集合中 | findByIdIn(List |
| True / False | 布尔判断 | findByEnabledTrue() |
排序规则
| 语法 | 示例 |
|---|---|
| OrderBy |
findByStatusOrderByAgeAsc() |
| OrderBy |
findByStatusOrderByCreatedAtDesc() |
限制返回条数
| 语法 | 示例 |
|---|---|
| findTop1By… | 查询符合条件的第一条记录 |
| findFirst3By… | 查询前三条 |
返回类型
| 返回类型 | 说明 |
|---|---|
| User | 查询单个结果(若多条结果会报错) |
| Optional |
单条结果,防止空指针 |
| List |
多条结果 |
| Page |
分页结果(需传入 Pageable) |
| boolean | existsBy… |
| long | countBy… |