如何在jOOQ中执行UPDATE时通过外键关联表返回字段?
问题原因与解决方案
问题根源
SQL标准中,UPDATE语句的RETURNING子句默认仅能返回**被更新表(此处为key_transfer)**自身的字段。你通过keyTransfer.realEstate().EXTERNAL_ID_MDM直接引用关联表real_estate的字段,jOOQ无法将这种关联引用直接转换为合法的RETURNING语法,因此报错提示该字段不存在于key_transfer表中。
而你之前在SELECT查询中能成功获取关联字段,是因为SELECT本身支持通过JOIN关联多表并直接读取关联字段,和UPDATE RETURNING的逻辑完全不同。
解决方案
根据你使用的数据库(以支持UPDATE ... FROM或子查询的PostgreSQL为例),提供两种可行实现方式:
方式1:在RETURNING中使用子查询
通过子查询关联real_estate表获取目标字段:
dsl.update(keyTransfer) .set(keyTransfer.SEND_OGO, ogo) .where(keyTransfer.ID.eq(keyTransferId)) .returning(DSL.field( select(REAL_ESTATE.EXTERNAL_ID_MDM) .from(REAL_ESTATE) .where(REAL_ESTATE.ID.eq(keyTransfer.REAL_ESTATE_ID)) )) .fetchOneInto(String.class);
方式2:使用UPDATE ... FROM关联表更新(仅部分数据库支持)
如果你的数据库支持UPDATE ... FROM语法(如PostgreSQL),可以先关联两张表,再返回关联表的字段:
dsl.update(keyTransfer) .set(keyTransfer.SEND_OGO, ogo) .from(REAL_ESTATE) .where(keyTransfer.REAL_ESTATE_ID.eq(REAL_ESTATE.ID)) .and(keyTransfer.ID.eq(keyTransferId)) .returning(REAL_ESTATE.EXTERNAL_ID_MDM) .fetchOneInto(String.class);
内容的提问来源于stack exchange,提问作者Gaziz Bakyt
相关产品推荐
相关产品推荐

