Разбрах, че jOOQ ще симулира SQL MERGE на системи (като PostgreSQL), които не го поддържат.
Имам таблица със серийна (автоматично нарастване) колона „id“ и колона „uri“ с низ. Искам да използвам цифрови идентификатори вместо URI в моята база данни, така че трябва да се уверя, че имам URI в таблицата за търсене на ID. Следвайки примера в ръководството на 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 не симулира MERGE на PostgreSQL?
Така че след това опитвам синтаксиса на базата данни H2:
createDSLContext().mergeInto(tableByName("uris"), fieldByName("uri")).values(uri.toString()).execute();
Взимам:
The H2-specific MERGE syntax is not supported in dialect : POSTGRES
Какво!? Но документацията на jOOQ казва, че синтаксисът H2 "може да бъде напълно симулиран от jOOQ за всички други бази данни, които поддържат SQL стандарта." Със сигурност PostgreSQL поддържа SQL стандарта. Наистина ли означава "...стандартната SQL версия на MERGE?"
Има ли някакъв начин да получа поддръжка на PostgreSQL за MERGE чрез jOOQ, или съм останал да правя същите заобиколни решения, които бих направил така или иначе?