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