возвращая значение с помощью jOOQ и PostgreSQL serial и RETURNING

1

У меня есть таблица uris PostgreSQL с последовательным (автоинкрементным) 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 в инструкции insert.

Как я могу получить автоматически созданный столбец из INSERT PostgreSQL INSERT с помощью jOOQ?

Теги:
jooq
sql-insert
sql-returning

1 ответ

1
Лучший ответ

Этот вопрос также обсуждается более подробно в пользовательской группе jOOQ.

По сути, вы столкнулись с известной проблемой, когда предложение RETURNING в настоящее время не поддерживается jOOQ 3.3 (и ниже) при использовании с простым SQL, а не сгенерированными таблицами. Это проблема:

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню