2017-04-06 48 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

你是什麼意思的「列設置」?有多種實現方式,例如你可以調用超級方法,然後再添加一列到生成的輸出中...... –