[英]JOOQ: How to map a record to an aliased table (from a nested query)
我有一个带有连接的嵌套查询,我正在尝试将结果映射回表。 查询类似于:
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();
像这样将结果映射回BUSINESS
record.into(BUSINESS).into(Business.class)
会导致大量异常,因为某些字段存在不明确的匹配。 实际错误是:
Ambiguous match found for BusinessId. Both "alias_34775958"."BusinessId" and "MCDH"."dbo"."SiteAddress"."BusinessId" match
在将记录映射到表中时,如何告诉 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)
调用中使用它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.