在JOOQ中DELETE .. RETURNING rowid无法正常工作

时间:2017-04-06 07:58:05

标签: java sql oracle jooq

我有一个oracle数据库,我正在尝试删除基于客户端编号的记录,查询返回已删除记录的rowid。执行查询时,我收到以下异常:java.lang.IllegalArgumentException:字段(rowid)不包含在Row中。如果我尝试返回另一个字段(例如client_number字段本身)而不是rowid,则查询工作正常。

我尝试执行的查询如下所示:

ClientDetails clt = CLIENT_DETAILS.as("clt");

ClientDetailsRecord result = context.deleteFrom(clt)
            .where(clt.CLIENT_NUMBER.equal(clientNumber))
            .returning(rowid())
            .fetchOne();

这是Jooq的限制,还是我做错了?

1 个答案:

答案 0 :(得分:2)

这是jOOQ 3.x的已知(且不幸)限制,它只能返回表CLIENT_DETAILS的声明列,没有像ROWID这样的“系统”列或者任何表达式。纠正此问题的相关功能请求是:https://github.com/jOOQ/jOOQ/issues/5622

您可以通过创建自己的CLIENT_DETAILS表来解决此限制,该表包含“合成”ROWID列,例如由:

  • 扩展CustomTable type
  • 通过将ROWID列添加到CLIENT_DETAILS表格来扩展代码生成器(请注意,这会产生不良副作用,例如在调用UpdatableRecord.store()时)