JOOQ 中使用 Row.mapping 实现子查询字段到嵌套 DTO 的映射

发布时间 - 2026-01-28 00:00:00    点击率:

本文介绍如何在 jooq 中通过 `row2.mapping()` 对关联表字段进行内联映射,将一对多/多对一关系中的子实体(

如 parent)直接构造为 java record 或 dto,避免手动组装或多次查询。

在使用 JOOQ 进行关系型数据查询时,常需将主表(如 child)与关联表(如 parent)的字段一并查出,并映射为包含嵌套对象的 Java 结构(例如 ChildDTO 内含 ParentDTO 字段)。JOOQ 并不原生支持“自动嵌套实体映射”,但可通过其强大的 Row.mapping() 机制优雅实现——关键在于正确使用导航路径与类型化 Row 表达式

以下是一个典型且推荐的实现方式(基于你提供的 schema):

List result = dslContext
    .select(
        CHILD.ID,
        CHILD.NAME,
        row(CHILD.parent().ID, CHILD.parent().NAME)
            .mapping(ParentDTO::new)  // ✅ 类型安全:Row2 → ParentDTO
    )
    .from(CHILD)
    .fetch(Records.mapping(ChildDTO::new));

其中:

  • CHILD.parent() 是 JOOQ 自动生成的外键导航路径(需确保代码生成时启用了 配置);
  • row(...).mapping(...) 返回一个 SelectField,可直接参与顶层 select();
  • Records.mapping(ChildDTO::new) 要求 ChildDTO 构造函数按 SELECT 字段顺序接收参数:(Long childId, String childName, ParentDTO parent)。

对应的 DTO 定义示例:

public record ChildDTO(Long id, String name, ParentDTO parent) {}
public record ParentDTO(Long id, String name) {}

⚠️ 注意事项:

  • 不要对 row(...) 包裹 DSL.field(...) —— 这会丢失泛型信息,导致 mapping() 不可用;
  • row(...).mapping(...) 仅适用于固定字段数的组合(如 row(a,b) → Row2,row(a,b,c) → Row3),JOOQ 提供了从 Row2 到 Row8 的完整支持;
  • 若需更灵活的映射(如动态字段、空值处理),可改用 convertFrom() + 自定义 Converter
  • 此方案本质是单次 SQL JOIN 查询 + 内存中结构重组,性能优于 N+1 查询,也比手动 fetchInto() + 循环组装更简洁安全。

总结:通过 RowN.mapping(),你无需引入额外框架(如 MapStruct 或 Jackson),即可在 JOOQ 的类型安全体系内完成“扁平结果集 → 嵌套对象”的声明式映射,是构建响应式、层次化 DTO 的最佳实践之一。


# java  # app  # sql  # String  # 构造函数  # select  # 循环  # 泛型  # 对象  # 是一个  # 适用于  # 可在  # 自定义  # 要对  # 可直接  # 可通过  # 也比  # 这会  # 关键在于 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251811 】 【 AI营销90571


相关推荐: php打包exe后无法访问网络共享_共享权限设置方法【教程】  如何在阿里云部署织梦网站?  PythonWeb开发入门教程_Flask快速构建Web应用  Laravel如何记录自定义日志?(Log频道配置)  北京企业网站设计制作公司,北京铁路集团官方网站?  Win11怎么恢复误删照片_Win11数据恢复工具使用【推荐】  如何快速配置高效服务器建站软件?  Laravel如何使用Contracts(契约)进行编程_Laravel契约接口与依赖反转  如何用好域名打造高点击率的自主建站?  制作公司内部网站有哪些,内网如何建网站?  浅谈redis在项目中的应用  简单实现jsp分页  Linux系统运维自动化项目教程_Ansible批量管理实战  Mybatis 中的insertOrUpdate操作  如何用美橙互联一键搭建多站合一网站?  JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)  简历没回改:利用AI润色让你的文字更专业  Laravel如何处理文件下载请求?(Response示例)  如何在万网开始建站?分步指南解析  百度输入法ai面板怎么关 百度输入法ai面板隐藏技巧  Laravel如何实现文件上传和存储?(本地与S3配置)  矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?  如何在阿里云服务器自主搭建网站?  Swift中循环语句中的转移语句 break 和 continue  EditPlus中的正则表达式 实战(4)  进行网站优化必须要坚持的四大原则  香港服务器租用每月最低只需15元?  Laravel用户认证怎么做_Laravel Breeze脚手架快速实现登录注册功能  java ZXing生成二维码及条码实例分享  微信推文制作网站有哪些,怎么做微信推文,急?  Laravel的路由模型绑定怎么用_Laravel Route Model Binding简化控制器逻辑  Laravel如何实现数据库事务?(DB Facade示例)  高防网站服务器:DDoS防御与BGP线路的AI智能防护方案  Python面向对象测试方法_mock解析【教程】  高端企业智能建站程序:SEO优化与响应式模板定制开发  如何用AWS免费套餐快速搭建高效网站?  详解jQuery中基本的动画方法  Laravel如何正确地在控制器和模型之间分配逻辑_Laravel代码职责分离与架构建议  佐糖AI抠图怎样调整抠图精度_佐糖AI精度调整与放大细化操作【攻略】  如何快速上传建站程序避免常见错误?  详解jQuery停止动画——stop()方法的使用  Laravel Artisan命令怎么自定义_创建自己的Laravel命令行工具完全指南  悟空识字如何进行跟读录音_悟空识字开启麦克风权限与录音  JavaScript 输出显示内容(document.write、alert、innerHTML、console.log)  如何用AI一键生成爆款短视频文案?小红书AI文案写作指令【教程】  香港服务器网站生成指南:免费资源整合与高速稳定配置方案  Laravel怎么多语言本地化设置_Laravel语言包翻译与Locale动态切换【手册】  免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?  如何快速搭建高效WAP手机网站?  如何在景安服务器上快速搭建个人网站?