我的数据库中有两个表: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的代码来看,它就是这样的(并且我想知道它为什么不按照我想要的方式工作)。结果是客户端具有两个相同的地址。
这样做的替代方法是什么?
答案 0 :(得分:1)
这确实是jOOQ中的一个错误。我已为此注册了#3634。
问题仅出现在别名的自联接中,因为Record.into(Table)
无法区分源自同一个表的两个表。要解决此问题,您可以手动将record
拆分为两个,然后再将其加载到AddressDao.fromRecord()
。