我的数据库中有两个表: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的代码,它就可以那样工作(我想知道为什么它不能按我想要的方式工作)。结果是一个具有两个相同地址的客户端。

什么是替代方法?

最佳答案

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

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

关于java - Jooq:别名表和Record.into,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25794388/

10-13 08:06