繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM