我的数据库中有两个表:Client
和Address
。 Client
引用Address
两次:分别作为BillToAddress
和ShipToAdress
。我想使用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/