Возвращая значение с помощью jOOQ и PostgreSQL serial и RETURNING
У меня есть PostgreSQL uris
стол с серийным (автоинкремент) uri_id
столбец и строка uri
колонка. Я могу запросить таблицу нормально, используя jOOQ:
createDSLContext().select(fieldByName("uri_id")).from(tableByName("uris"))
.where(fieldByName("uri").equal(uri.toString())).fetchOne(0, Integer.class))
Это возвращает Java Integer
, Но когда я вставляю новый URI, я хочу вернуть сгенерированный uri_id
ключ, поэтому я пытаюсь это:
createDSLContext().insertInto(tableByName("uris"), fieldByName("uri"))
.values(uri.toString()).returning(fieldByName("uri_id")).fetchOne().getValue(0, Integer.class)
На этот раз я получаю сообщение об ошибке:
Exception in thread "main" java.lang.IllegalArgumentException: Field 0 is not contained in list
В качестве теста я попытался указать буквальное значение для uri_id
в INSERT
Заявление, но все же получил ошибку.
Похоже, генерируется правильный SQL:
insert into "uris" ("uri") values ('http://example.com/') returning "uri_id"
Но возвращенная запись пуста. Это верно, даже когда я указываю буквальное uri_id
в заявлении вставки.
Как я могу получить автоматически сгенерированный столбец из PostgreSQL INSERT
заявление с использованием JOOQ?
1 ответ
Этот вопрос также обсуждается более подробно в группе пользователей jOOQ.
По сути, вы столкнулись с известной проблемой, когда RETURNING
Предложение в настоящее время не поддерживается jOOQ 3.3 (и ниже) при использовании с простым SQL, а не с сгенерированными таблицами. Это ссылка на проблему: