2017-04-06 46 views
3

我有一个oracle数据库,并试图删除基于客户端号码的记录,查询返回已删除记录的rowid。执行查询时,出现以下异常:java.lang.IllegalArgumentException:Field(rowid)未包含在Row中。如果我尝试返回一个不同的字段(如client_number字段本身)而不是rowid,则查询完美工作。DELETE ..返回rowid在JOOQ不起作用

查询我想执行这个样子的:

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

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

这是Jooq的限制,还是我这个做了错误的方式?

+0

的ROWID是伪列,即实际上并未声明为表的一部分。还有两行可以具有相同的ROWID的情况。不知道你打算如何使用它,因为它很难说它是否对你有任何用处。查看https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:53140678334596,了解一些ROWID考虑因素。 – BriteSponge

+0

@BriteSponge尽管ROWID是伪列,但JOOQ仍然允许我通过选择查询来检索它。不幸的是,尽管如果没有主键使用它并不是100%安全的,我仍然必须使用rowid,并且不能选择其他解决方法。 –

回答

2

这是jOOQ 3.x的已知(和不幸)限制,它只能返回表CLIENT_DETAILS的声明列,没有“系统”列如ROWID或任何表达式。相关的功能要求进行整治是:https://github.com/jOOQ/jOOQ/issues/5622

你可以解决此限制通过创建自己的CLIENT_DETAILS表,其中包括“合成” ROWID列,例如由:

  • 扩展CustomTable type
  • 通过添加ROWID列到你的CLIENT_DETAILS表扩展代码生成器(注意,这可能有不良副作用,例如呼叫UpdatableRecord.store()时)
+0

我已经尝试过扩展JavaGenerator,以便无论何时生成CLIENT_DETAILS表,我都会添加ROWID列。我的计划是重写generateTable(SchemaDefinition,TableDefinition)方法,并向表定义中的列添加ROWID列 - 这是我无法做到的,因为表定义没有列设置器。 –

+0

你是什么意思的“列设置”?有多种实现方式,例如你可以调用超级方法,然后再添加一列到生成的输出中...... –