From 9cb8d9b030134da448f8f98d6f513ee1f88cd832 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Wed, 17 Sep 2014 12:05:31 +0200 Subject: [PATCH] [#3634] Record.into(Table) maps to the wrong table when passing an aliased table after a self-join --- .../java/org/jooq/impl/AbstractRecord.java | 18 +++++++++++++----- .../java/org/jooq/impl/RecordDelegate.java | 2 +- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractRecord.java b/jOOQ/src/main/java/org/jooq/impl/AbstractRecord.java index b88c94003d..25e5bc6c4b 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractRecord.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractRecord.java @@ -541,7 +541,7 @@ abstract class AbstractRecord extends AbstractStore implements Record { @Override public final Record into(Field... f) { - return Utils.newRecord(fetched, Record.class, f, configuration()).operate(new TransferRecordState()); + return Utils.newRecord(fetched, Record.class, f, configuration()).operate(new TransferRecordState(f)); } // [jooq-tools] START [into-fields] @@ -688,15 +688,21 @@ abstract class AbstractRecord extends AbstractStore implements Record { @Override public final R into(Table table) { - return Utils.newRecord(fetched, table, configuration()).operate(new TransferRecordState()); + return Utils.newRecord(fetched, table, configuration()).operate(new TransferRecordState(table.fields())); } final R intoRecord(Class type) { - return Utils.newRecord(fetched, type, fields(), configuration()).operate(new TransferRecordState()); + return Utils.newRecord(fetched, type, fields(), configuration()).operate(new TransferRecordState(null)); } private class TransferRecordState implements RecordOperation { + private final Field[] targetFields; + + TransferRecordState(Field[] targetFields) { + this.targetFields = targetFields; + } + @Override public R operate(R target) throws MappingException { AbstractRecord source = AbstractRecord.this; @@ -708,8 +714,10 @@ abstract class AbstractRecord extends AbstractStore implements Record { AbstractRecord t = (AbstractRecord) target; // Iterate over target fields, to avoid ambiguities when two source fields share the same name. - for (int targetIndex = 0; targetIndex < t.size(); targetIndex++) { - Field targetField = t.field(targetIndex); + // [#3634] If external targetFields are provided, use those instead of the target record's fields. + // The record doesn't know about aliased tables, for instance. + for (int targetIndex = 0; targetIndex < (targetFields != null ? targetFields.length : t.size()); targetIndex++) { + Field targetField = (targetFields != null ? targetFields[targetIndex] : t.field(targetIndex)); int sourceIndex = fields.indexOf(targetField); if (sourceIndex >= 0) { diff --git a/jOOQ/src/main/java/org/jooq/impl/RecordDelegate.java b/jOOQ/src/main/java/org/jooq/impl/RecordDelegate.java index 6eabe4b8e8..996e063bc4 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RecordDelegate.java +++ b/jOOQ/src/main/java/org/jooq/impl/RecordDelegate.java @@ -93,7 +93,7 @@ class RecordDelegate { if (configuration != null) { providers = configuration.recordListenerProviders(); - if (providers != null) { + if (providers != null && providers.length > 0) { listeners = new RecordListener[providers.length]; ctx = new DefaultRecordContext(configuration, executeType(), record);