devolviendo un valor con jOOQ y PostgreSQL serial y REGRESANDO
-
26-12-2019 - |
Pregunta
tengo un postgresql uris
tabla con serial (autoincremental) uri_id
columna y cadena uri
columna.Puedo consultar la tabla bien usando jOOQ:
createDSLContext().select(fieldByName("uri_id")).from(tableByName("uris"))
.where(fieldByName("uri").equal(uri.toString())).fetchOne(0, Integer.class))
Eso devuelve un Java Integer
.Pero cuando inserto un nuevo URI, quiero recuperar el generado uri_id
clave, así que intento esto:
createDSLContext().insertInto(tableByName("uris"), fieldByName("uri"))
.values(uri.toString()).returning(fieldByName("uri_id")).fetchOne().getValue(0, Integer.class)
Esta vez me sale un error:
Exception in thread "main" java.lang.IllegalArgumentException: Field 0 is not contained in list
Sólo como prueba, intenté proporcionar un valor literal para uri_id
en el INSERT
declaración, pero aún así aparece el error.
Parece que se está generando el SQL correcto:
insert into "uris" ("uri") values ('http://example.com/') returning "uri_id"
Pero el registro devuelto está vacío.Esto es cierto incluso cuando especifico un literal. uri_id
en la declaración de inserción.
¿Cómo puedo recuperar una columna generada automáticamente desde PostgreSQL? INSERT
declaración usando jOOQ?
Solución
Esta cuestión también se está debatiendo más detalladamente en el grupo de usuarios jOOQ.
Básicamente, te encuentras con un problema conocido en el que el RETURNING
Actualmente, la cláusula no es compatible con jOOQ 3.3 (y versiones anteriores) cuando se usa con SQL simple, en lugar de con tablas generadas.Esta es la referencia del problema: