Spring Data JPA基本方法调用规律

发布于:2025-07-09 ⋅ 阅读:(11) ⋅ 点赞:(0)

一、命名规则核心逻辑

派生方法名由三部分组成:findBy + 属性名 + 条件,其中:

  1. 前缀(固定关键词)findBydeleteBycountByexistsBy 等。
  2. 属性名:实体类的字段名(需严格匹配驼峰命名)。
  3. 条件:可选,如 GreaterThanLessThanLike 等。

示例:

// 方法名       = 前缀 + 属性名 + 条件
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);

五、实战技巧:如何快速编写派生方法

  1. 使用 IDE 自动补全
    在接口中输入 findBy,IDE 会根据实体类字段自动提示可用的方法名。

  2. 遵循步骤推导

    • 确定前缀:根据操作类型选择 findBydeleteBy 等。
    • 列出条件属性:按顺序拼接实体字段名(如 nameage)。
    • 添加条件关键字:在属性后添加 GreaterThanLike 等(可选)。
    • 排序与分页:添加 OrderByXxxAsc 或使用 Pageable 参数。
  3. 复杂查询用 @Query
    当派生方法名过长(超过 3 个条件)或逻辑复杂时,推荐使用 @Query 注解直接写 SQL。

六、示例对照表

需求描述 派生方法名
查询年龄大于 18 且名字包含 "张" 的用户 findByAgeGreaterThanAndNameLike(int age, String name)
删除状态为 "INACTIVE" 的用户 deleteByStatus(String status)
统计邮箱不为空的用户数 countByEmailNotNull()
查询用户名是 "admin" 或 "root" 的用户 findByUsernameIn(List<String> usernames)
查询最近注册的 10 个用户(按注册时间降序) findTop10ByOrderByRegisterTimeDesc()

七、注意事项

  1. 字段名严格匹配:属性名必须与实体类字段完全一致(包括大小写)。
  2. 避免深层嵌套:关联查询建议不超过 2 层(如 user.address.city),否则用 @Query
  3. 性能问题:复杂查询(如多表关联)使用派生方法可能生成低效 SQL,需通过 @Query 优化。

网站公告

今日签到

点亮在社区的每一天
去签到