Возвращая значение с помощью 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, а не с сгенерированными таблицами. Это ссылка на проблему:

https://github.com/jOOQ/jOOQ/issues/2374

Другие вопросы по тегам