【问题标题】:JOOQ: How to map a record to an aliased table (from a nested query)JOOQ:如何将记录映射到别名表(来自嵌套查询)
【发布时间】:2020-06-12 00:39:16
【问题描述】:

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

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 会导致大量异常,因为某些字段的匹配项不明确。 实际错误是:

Ambiguous match found for BusinessId. Both "alias_34775958"."BusinessId" and "MCDH"."dbo"."SiteAddress"."BusinessId" match

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

【问题讨论】:

    标签: java sql jooq


    【解决方案1】:

    您对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) 调用中使用它。

    【讨论】:

    • 这可行,但如果有某种方法可以更新结果中的别名以便我可以将记录传递给通用记录处理器,那就太好了。我有一些代码将记录映射到 POJO,当结果来自带有嵌套查询的查询时,我必须特殊情况。类似result.realias("oldAlias", "newAlias")result.realias("oldAlias", BUSINESS)
    • @EliPulsifer:这是一个有趣的想法。我想知道在源查询中修复别名而不是修补结果是否会更好。如果您认为这是一个值得追求的想法,请随时在此处创建功能请求:github.com/jOOQ/jOOQ/issues/new
    猜你喜欢
    • 2023-01-24
    • 2020-12-26
    • 2014-07-19
    • 1970-01-01
    • 2021-01-08
    • 2015-11-26
    • 2013-07-15
    • 1970-01-01
    • 2021-02-14
    相关资源
    最近更新 更多