以下是Spring Data JPA方法命名规则的完整总结,按场景分类整理:
一、基础命名规则
-
方法前缀
find...
:基础查询(默认返回实体列表或单个实体)read...
:等同于find
,强调直接加载实体(JPA会尝试缓存)query...
:自定义复杂查询(需配合@Query注解)count...
:返回记录数(如countBy
)exists...
:返回布尔值(如existsById
)
-
条件组合符
By
:条件分隔符(必选)And
/Or
:多条件组合- 示例:
findByAgeGreaterThanAndEmailLike
二、条件操作符
操作符 | 对应SQL条件 | 示例方法名 |
---|---|---|
Between | BETWEEN | findByScoreBetween |
LessThan | < | findByAgeLessThan |
LessThanEqual | <= | findByAgeLessThanEqual |
GreaterThan | > | findByScoreGreaterThan |
GreaterThanEqual | >= | findByAgeGreaterThanEqual |
After /Before | 日期比较 | findCreatedBefore |
StartingWith | LIKE ‘xxx%’ | findByUsernameStartingWith |
EndingWith | LIKE ‘%xxx’ | findByEmailEndingWith |
Containing | LIKE ‘%xxx%’ | findByContentContaining |
Is /Equals | = | findByStatusIs |
IsNull | IS NULL | findByAddressIsNull |
三、排序与分页
-
排序
List<User> findByAgeOrderByLastNameDesc(); // 先按年龄查询,再按姓氏降序排序
-
分页/限制
List<User> findFirst10By(); // 返回前10条 List<User> findTop3ByOrderByIdDesc(); // 按ID降序取前3
四、集合操作
-
In/NotIn
List<User> findByStatusIn(Collection<String> statuses); List<User> findByIdsNotIn(Long[] ids);
-
Exists
boolean existsByUsername(String username); // 返回布尔值
五、关联查询
-
嵌套属性
List<Order> findByUser_Address_City(String city); // 通过User的Address的city属性查询
-
关联集合
List<Post> findByComments_TextContains(String text); // 查询包含特定文本的评论关联帖子
六、返回类型
返回类型 | 示例方法名 | 说明 |
---|---|---|
Optional<T> | findById(Long id) | 可能为空的单个实体 |
List<T> | findByStatus(String) | 多个结果列表 |
Long | countByEnabledTrue() | 计数查询 |
boolean | existsByEmail(...) | 存在性判断 |
七、特殊用法
-
忽略大小写
List<User> findByNameIgnoreCase(String name); // 不区分大小写
-
正则表达式
List<User> findByUsernameRegex(@Param("regex") String regex); // 使用`Regex`后缀
八、命名规则限制
-
不支持的场景
- 需要JOIN多表的复杂查询(需用@Query)
- 自定义聚合函数(如
SUM
,AVG
) - 需要自定义SQL方言的场景
-
命名冲突处理
- 使用
%
占位符:findByStatusIn(%s)
(需配合Specifications) - 使用
Spec
后缀:UserSpec
配合@Query
实现动态查询
- 使用
九、最佳实践
-
方法名规范
- 使用CamelCase且不加下划线
- 避免使用保留字(如
by
不能作为开头)
-
性能注意
- 避免生成N+1查询(需检查实际生成的SQL)
- 复杂查询建议使用
@Query
显式声明
当命名规则无法满足需求时,可结合
@Query
注解或Specifications实现更复杂的查询逻辑。