From 203341cf9d7fa67aa50bb3fe1b6d5c98a9c7814d Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Thu, 12 Mar 2020 11:57:25 +0100 Subject: [PATCH] [jOOQ/jOOQ#3035] INSERT .. RETURNING does not return any value in H2, when no AUTO_INCREMENT column is involved --- .../java/org/jooq/impl/AbstractDMLQuery.java | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractDMLQuery.java b/jOOQ/src/main/java/org/jooq/impl/AbstractDMLQuery.java index 1b7bc443c8..f90fff9846 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractDMLQuery.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractDMLQuery.java @@ -1198,17 +1198,22 @@ abstract class AbstractDMLQuery extends AbstractRowCountQuery ) { if (values != null && values.length > 0) { - // This shouldn't be null, as relevant dialects should - // return empty generated keys ResultSet - if (table.getIdentity() != null) { - final Field field = (Field) table.getIdentity().getField(); + // [#3035] Support identity columns and single column primary keys + final Field identity = + table.getIdentity() != null + ? (Field) table.getIdentity().getField() + : table.getPrimaryKey() != null && table.getPrimaryKey().getFields().size() == 1 + ? table.getPrimaryKey().getFields().get(0) + : null; + + if (identity != null) { Object[] ids = new Object[values.length]; for (int i = 0; i < values.length; i++) - ids[i] = field.getDataType().convert(values[i]); + ids[i] = identity.getDataType().convert(values[i]); // Only the IDENTITY value was requested. No need for an // additional query - if (returningResolvedAsterisks.size() == 1 && new Fields<>(returningResolvedAsterisks).field(field) != null) { + if (returningResolvedAsterisks.size() == 1 && new Fields<>(returningResolvedAsterisks).field(identity) != null) { for (final Object id : ids) { ((Result) getResult()).add( Tools.newRecord( @@ -1237,7 +1242,7 @@ abstract class AbstractDMLQuery extends AbstractRowCountQuery .from(table) // [#5050] [#9946] Table.getIdentity() doesn't produce aliased fields yet - .where(table.field(field).in(ids)) + .where(table.field((Field) identity).in(ids)) .fetch(); returnedResult.attach(originalConfiguration);