Jooq:别名表和Record.into

时间:2014-09-11 18:12:42

标签: java sql alias java-8 jooq

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

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

1 个答案:

答案 0 :(得分:1)

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

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