renvoyer une valeur avec jOOQ et PostgreSQL série et RETURNING
-
26-12-2019 - |
Question
J'ai un PostgreSQL uris
table avec série (auto-incrémentation) uri_id
colonne et chaîne uri
colonne.Je peux bien interroger la table en utilisant jOOQ :
createDSLContext().select(fieldByName("uri_id")).from(tableByName("uris"))
.where(fieldByName("uri").equal(uri.toString())).fetchOne(0, Integer.class))
Cela renvoie un Java Integer
.Mais lorsque j'insère un nouvel URI, je souhaite récupérer le fichier généré uri_id
clé, alors j'essaye ceci:
createDSLContext().insertInto(tableByName("uris"), fieldByName("uri"))
.values(uri.toString()).returning(fieldByName("uri_id")).fetchOne().getValue(0, Integer.class)
Cette fois, j'obtiens une erreur :
Exception in thread "main" java.lang.IllegalArgumentException: Field 0 is not contained in list
À titre de test, j'ai essayé de fournir une valeur littérale pour uri_id
dans le INSERT
déclaration, mais j'ai toujours l'erreur.
Il semble que le code SQL correct soit généré :
insert into "uris" ("uri") values ('http://example.com/') returning "uri_id"
Mais l'enregistrement renvoyé est vide.Ceci est vrai même lorsque je précise un littéral uri_id
dans l'instruction d'insertion.
Comment puis-je récupérer une colonne générée automatiquement à partir d'un PostgreSQL INSERT
déclaration utilisant jOOQ ?
La solution
Cette question est également discutée plus en détail sur le Groupe d'utilisateurs jOOQ.
Essentiellement, vous rencontrez un problème connu où le RETURNING
La clause n'est actuellement pas prise en charge par jOOQ 3.3 (et versions antérieures) lorsqu'elle est utilisée avec du SQL brut, au lieu d'avec des tables générées.Voici la référence du problème :