一、命名规则核心逻辑
派生方法名由三部分组成:findBy + 属性名 + 条件,其中:
- 前缀(固定关键词) :
findBy、deleteBy、countBy、existsBy等。 - 属性名:实体类的字段名(需严格匹配驼峰命名)。
- 条件 :可选,如
GreaterThan、LessThan、Like等。
示例:
// 方法名 = 前缀 + 属性名 + 条件
List<User> findByAgeGreaterThan(int age); // 查询年龄大于 age 的用户
二、常见前缀与用途
| 前缀 | 用途 | 返回值类型 |
|---|---|---|
findBy |
查询符合条件的记录 | List<T>、Optional<T> |
deleteBy |
删除符合条件的记录 | long(删除数量) |
countBy |
统计符合条件的记录数 | long |
existsBy |
判断是否存在符合条件的记录 | boolean |
findFirstBy |
查询符合条件的第一条记录 | Optional<T> |
findTop5By |
查询符合条件的前 5 条记录 | List<T> |
三、常用条件关键字
| 条件关键字 | 含义 | 示例方法名 | 生成 SQL 片段 |
|---|---|---|---|
And |
逻辑与 | findByNameAndAge |
WHERE name = ? AND age = ? |
Or |
逻辑或 | findByNameOrAge |
WHERE name = ? OR age = ? |
GreaterThan |
大于 | findByAgeGreaterThan |
WHERE age > ? |
LessThan |
小于 | findByAgeLessThan |
WHERE age < ? |
Between |
在区间内 | findByAgeBetween |
WHERE age BETWEEN ? AND ? |
Like |
模糊匹配 | findByNameLike |
WHERE name LIKE ? |
IgnoreCase |
忽略大小写 | findByNameIgnoreCase |
WHERE UPPER(name) = UPPER(?) |
OrderBy |
排序 | findByNameOrderByAgeDesc |
WHERE name = ? ORDER BY age DESC |
IsNull / NotNull |
空值判断 | findByEmailIsNull |
WHERE email IS NULL |
In / NotIn |
包含 / 不包含 | findByAgeIn |
WHERE age IN (?, ?, ?) |
四、处理复杂属性与嵌套查询
1. 关联实体属性
通过 _ 或直接拼接关联实体的属性名:
// 假设 User 有一个 Address 类型的关联字段 address
List<User> findByAddress_City(String city); // 等价于 findByAddressCity
2. 集合属性查询
若实体包含集合字段(如 List<Role>):
// 查询拥有特定角色的用户
List<User> findByRolesName(String roleName);
五、实战技巧:如何快速编写派生方法
-
使用 IDE 自动补全
在接口中输入
findBy,IDE 会根据实体类字段自动提示可用的方法名。 -
遵循步骤推导
- 确定前缀 :根据操作类型选择
findBy、deleteBy等。 - 列出条件属性 :按顺序拼接实体字段名(如
name、age)。 - 添加条件关键字 :在属性后添加
GreaterThan、Like等(可选)。 - 排序与分页 :添加
OrderByXxxAsc或使用Pageable参数。
- 确定前缀 :根据操作类型选择
-
复杂查询用
@Query当派生方法名过长(超过 3 个条件)或逻辑复杂时,推荐使用
@Query注解直接写 SQL。
六、示例对照表
| 需求描述 | 派生方法名 |
|---|---|
| 查询年龄大于 18 且名字包含 "张" 的用户 | findByAgeGreaterThanAndNameLike(int age, String name) |
| 删除状态为 "INACTIVE" 的用户 | deleteByStatus(String status) |
| 统计邮箱不为空的用户数 | countByEmailNotNull() |
| 查询用户名是 "admin" 或 "root" 的用户 | findByUsernameIn(List<String> usernames) |
| 查询最近注册的 10 个用户(按注册时间降序) | findTop10ByOrderByRegisterTimeDesc() |
七、注意事项
- 字段名严格匹配:属性名必须与实体类字段完全一致(包括大小写)。
- 避免深层嵌套 :关联查询建议不超过 2 层(如
user.address.city),否则用@Query。 - 性能问题 :复杂查询(如多表关联)使用派生方法可能生成低效 SQL,需通过
@Query优化。