如何将 2 条记录(多对一)的 Result 对象映射到 jOOQ 中它们各自的记录对象中?

Posted

技术标签:

【中文标题】如何将 2 条记录(多对一)的 Result 对象映射到 jOOQ 中它们各自的记录对象中?【英文标题】:How can I map a Result object of 2 records (many to one) into their respective record objects in jOOQ? 【发布时间】:2019-08-20 11:27:36 【问题描述】:

我有一张桌子X 和另一张Y。我想从X 加载一条记录,该记录具有Y 的外键,所以我执行左连接:

X x = dslContext.select()
                .from(Tables.X)
                .leftJoin(Tables.Y)
                .on(Tables.X.SOME_ID.eq(Tables.Y.ID))
                .where(Tables.X.IS.eq(id))
                .fetchOptionalInto(XRecord.class)

这很好,但我对如何从中提取Y 感到有点困惑?我尝试使用into,但问题是如果Y 中的列也存在于X 中,当我尝试映射结果@987654332 时,我将看到X 而不是Y 的值@一个YRecord。我知道有fetchGroups,但我只有XRecord 可以使用。

【问题讨论】:

【参考方案1】:

您可以从通用记录类型映射您的记录,如下所示:

Record r = dslContext
                .select()
                .from(Tables.X)
                .leftJoin(Tables.Y)
                .on(Tables.X.SOME_ID.eq(Tables.Y.ID))
                .where(Tables.X.IS.eq(id))
                .fetchOne();

if (r != null) 
    XRecord x = r.into(Tables.X);
    YRecord y = r.into(Tables.Y);

【讨论】:

很好,我试试这个! 如果Tables.Y 有多个结果,我该怎么办?我可以将它们提取到列表中吗? jOOQ 方法是使用ResultQuery.fetchGroups() 生成Map<XRecord, List<YRecord>>。或者您可以使用第三方工具,例如简单的平面映射器:simpleflatmapper.org/0106-getting-started-jooq.html 谢谢,这些成功了!所以上面是多对一的最佳实践,一对多是fetchGroups,对吗?【参考方案2】:

我刚刚想通了。 jOOQ 代码生成器创建一个名为 Keys 的对象,其中包含项目中的所有键。有了它,你可以使用

xRecord.fetchParent(X_TO_Y_ID_FKEY)

它会为您获取父级(也适用于子级)。 不过有一个警告。 Record 需要将 attach 转换为 DSLContext 才能以这种方式使用它。

【讨论】:

我建议您不要将此作为您在此处尝试实现的解决方法!这会产生一个 N+1 问题。最好改用连接输出。 那么fetchParent 的用例是什么? 有时,您希望延迟获取给定子记录的父记录。但在这种情况下,对于 N 条子记录,最好使用连接急切地获取 N 条父记录。

以上是关于如何将 2 条记录(多对一)的 Result 对象映射到 jOOQ 中它们各自的记录对象中?的主要内容,如果未能解决你的问题,请参考以下文章

mybatis 一对多和多对一

数据库之 表与表之间的关系

多表查询

数据库之 表与表之间的关系

数据库之 表与表之间的关系

数据库之 表与表之间的关系