当前位置: 首页 > news >正文

Spring Data JPA基本方法调用规律

一、命名规则核心逻辑

派生方法名由三部分组成: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逻辑与findByNameAndAgeWHERE name = ? AND age = ?
Or逻辑或findByNameOrAgeWHERE name = ? OR age = ?
GreaterThan大于findByAgeGreaterThanWHERE age > ?
LessThan小于findByAgeLessThanWHERE age < ?
Between在区间内findByAgeBetweenWHERE age BETWEEN ? AND ?
Like模糊匹配findByNameLikeWHERE name LIKE ?
IgnoreCase忽略大小写findByNameIgnoreCaseWHERE UPPER(name) = UPPER(?)
OrderBy排序findByNameOrderByAgeDescWHERE name = ? ORDER BY age DESC
IsNull / NotNull空值判断findByEmailIsNullWHERE email IS NULL
In / NotIn包含 / 不包含findByAgeInWHERE 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 优化。
http://www.lryc.cn/news/582197.html

相关文章:

  • RK3588 Android SDK 实战全解析 —— 架构、原理与开发关键点
  • linux qt 使用log4cpp库
  • 对象存储-OSS
  • centos停止维护后更换yum源
  • Centos Docker 安装(100%成功)
  • 腾讯云 CDN 不支持 WebSocket 的现状与华为云 CDN 的替代方案-优雅草卓伊凡
  • 【DPDK应用篇】事件驱动架构:eventdev异步处理模型的设计与实现
  • 循环移位网络设计
  • ubuntu server系统 安装宝塔
  • 【build.gradle中的各种jdk或者是jvm,sdk版本作用区别,详细说明】
  • RKAndroid11-系统设置新增开关选项
  • Kotlin流操作符简介
  • 力扣网编程274题:H指数之计数排序(中等)
  • 分布式推客系统架构设计:从微服务到高性能计算的实践路径
  • 安装 Elasticsearch IK 分词器
  • Coco AI 实战(一):Coco Server Linux 平台部署
  • 前端技术博客汇总文档
  • 万物智联时代启航:鸿蒙OS重塑全场景开发新生态
  • 【读代码】深度解析TEN VAD:实时语音活动检测的高性能开源解决方案
  • 一份激光雷达农业数据的分析
  • 【Linux | 网络】网络编程套接字
  • [netty5: LifecycleTracer ResourceSupport]-源码分析
  • 50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | ContentPlaceholder(背景占位)
  • 什么是Web3?金融解决方案
  • 康布雷时刻:AI革命中的领导力觉醒与组织重构
  • uniapp下拉刷新+分页组件(z-paging 组件)
  • 2. 你可以说一下 http 版本的发展过程吗
  • 选择排序算法详解(含Python实现)
  • CentOS-7-x86_64解决:使用NAT模式无法ping通www.baidu.com或无法ping 8.8.8.8问题。
  • 阿里arthas(阿尔萨斯)简介