【问题标题】:Jooq: Aliased tables and Record.intoJooq:别名表和 Record.into
【发布时间】:2014-11-05 19:29:47
【问题描述】:

我的数据库中有两个表:ClientAddressClient 引用 Address 两次:分别为 BillToAddressShipToAdress。我想使用 jOOQ 用他的地址检索Client。这是我的尝试:

public static Client fromRecord(Record record, Table<AddressRecord> billTo, Table<AddressRecord> shipTo) {
    return new Client(record.getValue(CLIENT.CLIENT_ID),
            AddressDao.fromRecord(record.into(billTo)),
            AddressDao.fromRecord(record.into(shipTo))
    );
}

public List<Client> loadAll() {
    superfirma.jooq.local.tables.Address billTo = ADDRESS.as("billTo");
    superfirma.jooq.local.tables.Address shipTo = ADDRESS.as("shipTo");
    return jooqContext.select().from(CLIENT)
                      .join(billTo).on(CLIENT.BILL_TO_ADDRESS_ID.eq(billTo.ADDRESS_ID))
                      .leftOuterJoin(shipTo).on(CLIENT.SHIP_TO_ADDRESS_ID.eq(shipTo.ADDRESS_ID))
                      .fetch(record -> fromRecord(record, billTo, shipTo));
}

它不起作用:record.into 按列名匹配,不考虑(别名)表名。从我快速浏览 jOOQ 的代码来看,它就是这样工作的(我想知道为什么它不能按我想要的方式工作)。结果是一个具有两个相同地址的客户端。

这样做的替代方法是什么?

【问题讨论】:

    标签: java sql alias java-8 jooq


    【解决方案1】:

    这确实是 jOOQ 中的一个错误。我已经为此注册了#3634

    此问题仅出现在别名自联接中,因为 Record.into(Table) 无法区分源自同一个表的两个表。作为一种解决方法,您可以手动将 record 拆分为两部分,然后再将其加载到 AddressDao.fromRecord() 中。

    【讨论】:

      猜你喜欢
      • 2019-02-10
      • 2014-11-16
      • 1970-01-01
      • 2017-09-26
      • 2020-12-31
      • 2015-03-24
      • 2023-03-22
      • 2012-08-05
      • 2016-08-03
      相关资源
      最近更新 更多