我明白了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支持,還是我堅持做同樣的解決方法,我會做呢?