如何将 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 中它们各自的记录对象中?的主要内容,如果未能解决你的问题,请参考以下文章