java - JOOQ:如何将记录映射到别名表(来自嵌套查询)

标签 java sql jooq

我有一个带有联接的嵌套查询,我正在尝试将结果映射回表。查询类似于:

var nested = context.select(BUSINESS.fields()).from(BUSINESS).limit(size).offset(size * page);
var idField = nested.field(BUSINESS.UIDBUSINESSID);

var result = context.select(nested.fields()).select(BUSINESSALIAS.fields())
.select(BUSINESSCONTACT.fields()).select(BUSINESSIDENTIFIER.fields())
.select(SITEADDRESS.fields()).select(WEBSITE.fields())
.from(nested)
.leftJoin(BUSINESSALIAS)
.on(idField.eq(BUSINESSALIAS.BUSINESSID))
.leftJoin(BUSINESSCONTACT)
.on(idField.eq(BUSINESSCONTACT.BUSINESSID))
.leftJoin(BUSINESSIDENTIFIER)
.on(idField.eq(BUSINESSIDENTIFIER.BUSINESSID))
.leftJoin(SITEADDRESS)
.on(idField.eq(SITEADDRESS.BUSINESSID))
.leftJoin(WEBSITE)
.on(idField.eq(WEBSITE.BUSINESSID))
.fetch();

像这样 record.into(BUSINESS).into(Business.class) 将结果映射回 BUSINESS 会导致大量异常,因为某些字段存在不明确的匹配。 实际错误是:

发现 BusinessId 不明确匹配。 “alias_34775958”.“BusinessId”和“MCDH”.“dbo”.“SiteAddress”.“BusinessId”均匹配

在将记录映射到表中时,如何告诉 JOOQ BUSINESS 表限定符应该是别名 alias_34775958

最佳答案

您调用record.into(BUSINESS)导致这种歧义,因为您的查询实际上没有 BUSINESS 中的任何列表(尽管您在派生表中使用此表)。

尝试使用record.into(nested.fields())相反,它将生成精确的字段引用,包括生成的别名。或者,您也可以使用具有显式别名的表:

var nested = table(select(BUSINESS.fields())
                   .from(BUSINESS)
                   .limit(size)
                   .offset(size * page)).as("b");

现在,nested类型为Table<?>而不是Select<?> ,你可以直接在你的 record.into(nested) 中使用它打电话。

关于java - JOOQ:如何将记录映射到别名表(来自嵌套查询),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60442735/

相关文章:

sql - 实现软删除的最佳方式是什么?

java - 无法修复 JOOQ 查询中的 "Unknown table"异常

java - 如何在 JOOQ 中传递参数(Null)和硬编码值

java - Joda Time 将 2016 年 1 月 1 日的 yyyyww 返回为 201653

java - Windows启动时如何启动Java Jar?

SQL Server UTC 到本地时间

sql - 检查表定义中的条件

java - 如何使用jOOQ RecordUnmapper?

java - 使用 jdk11 和 Eclipse 2019-03 (4.11.0) 的基本 javafx11 应用程序的运行时错误

java - Bukkit插件: Can't import command