2014-04-11 73 views
0

我明白了jOOQ會模擬不支持它的系統(如PostgreSQL)上的SQL MERGE。jOOQ MERGE支持PostgreSQL條件插入

我有一個序列(自動增量)「id」列和字符串「uri」列的表。我想在數據庫中使用數字ID而不是URI,所以我必須確保在ID查找表中有一個URI。所以下面的jOOQ手冊中的例子,我想這會工作:

createDSLContext().mergeInto(tableByName("uris")) 
.using(createDSLContext().selectOne()) 
.on(fieldByName("uri").equal("http://example.com/")) 
.whenNotMatchedThenInsert(fieldByName("uri")) 
.values("http://example.com/").execute(); 

這給了我DataAccessException說是這樣的:

SQL [merge into "uris" using (select 1) on "uri" = ? when not matched then insert ("uri") values (?)]; ERROR: syntax error at or near "merge" 

但隨後的日誌說jOOQ前進並試圖執行帶有綁定值的查詢。但該表從未更新。所以我猜JOOQ不會在PostgreSQL上模擬MERGE嗎?

所以我再試試H2數據庫語法:

createDSLContext().mergeInto(tableByName("uris"), fieldByName("uri")).values(uri.toString()).execute(); 

我得到:

The H2-specific MERGE syntax is not supported in dialect : POSTGRES 

什麼!但jOOQ documentation表示H2語法「可以完全由jOOQ模擬所有其他支持SQL標準的數據庫」。當然,PostgreSQL支持SQL標準。這是否意味着「...... MERGE的SQL標準版本?」

有沒有辦法通過jOOQ獲得對MERGE的PostgreSQL支持,還是我堅持做同樣的解決方法,我會做呢?

回答

1

可以肯定的,如果給定的SQL功能由jOOQ爲你的數據庫支持,請考慮的Javadoc的@Support有關DSL方法的註釋。 This is also documented in the manual。在這種情況下,DSLContext.mergeInto(),在這裏你可以看到,這種說法目前僅支持這些SQLDialects

@Support(value={CUBRID,DB2,HSQLDB,ORACLE,SQLSERVER,SYBASE}) 

MERGE是一個非常強大的聲明,是不是真的很容易模仿,如果你的數據庫本身不支持它。 「

」可以通過jOOQ完全模擬所有其他支持SQL標準的數據庫。「當然,PostgreSQL支持SQL標準。這是否意味着「...... MERGE的SQL標準版本?」

是的,當然,SQL標準MERGE聲明必須支持:-)我們將在手冊中闡明這一點。我爲此註冊了issue #3183

有沒有辦法通過jOOQ獲得對MERGE的PostgreSQL支持,還是我堅持做同樣的解決方法,我會做呢?

不幸的是,我們現在還沒有PostgreSQL的解決方案。請隨時在jOOQ User Group上討論可能的解決方案。