diff --git a/jOOQ/src/main/java/org/jooq/impl/Fields.java b/jOOQ/src/main/java/org/jooq/impl/Fields.java index 243ff783d0..349236cbbe 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Fields.java +++ b/jOOQ/src/main/java/org/jooq/impl/Fields.java @@ -52,6 +52,8 @@ import org.jooq.Field; import org.jooq.Name; import org.jooq.Record; import org.jooq.RecordType; +import org.jooq.Table; +import org.jooq.TableField; /** * A simple wrapper for Field[], providing some useful lookup @@ -91,11 +93,34 @@ class Fields extends AbstractQueryPart implements RecordType f1 : fields) { - if (f1.getName().equals(name)) { - return (Field) f1; + // [#4283] table / column matches are better than only column matches + Field columnMatch = null; + + String tableName = tableName(field); + String fieldName = field.getName(); + + for (Field f : fields) { + if (tableName != null) { + String tName = tableName(f); + + if (tName != null && tableName.equals(tName) && f.getName().equals(fieldName)) + return (Field) f; + } + + // In case no exact match was found, return the first field with matching name + if (columnMatch == null && f.getName().equals(fieldName)) + columnMatch = f; + } + + return (Field) columnMatch; + } + + private final String tableName(Field field) { + if (field instanceof TableField) { + Table table = ((TableField) field).getTable(); + + if (table != null) { + return table.getName(); } } diff --git a/jOOQ/src/main/java/org/jooq/impl/QualifiedField.java b/jOOQ/src/main/java/org/jooq/impl/QualifiedField.java index 7734394072..807cdb6f43 100644 --- a/jOOQ/src/main/java/org/jooq/impl/QualifiedField.java +++ b/jOOQ/src/main/java/org/jooq/impl/QualifiedField.java @@ -40,11 +40,16 @@ */ package org.jooq.impl; +import java.util.Arrays; + import org.jooq.Context; import org.jooq.DataType; import org.jooq.Field; import org.jooq.Name; +import org.jooq.Record; import org.jooq.RenderContext; +import org.jooq.Table; +import org.jooq.TableField; /** * A QualifiedField is a {@link Field} that always renders a field name @@ -52,19 +57,23 @@ import org.jooq.RenderContext; * * @author Lukas Eder */ -class QualifiedField extends AbstractField { +class QualifiedField extends AbstractField implements TableField { /** * Generated UID */ - private static final long serialVersionUID = 6937002867156868761L; + private static final long serialVersionUID = 6937002867156868761L; - private final Name name; + private final Name name; + private final Table table; QualifiedField(Name name, DataType type) { super(name.getName()[name.getName().length - 1], type); this.name = name; + this.table = name.getName().length > 1 + ? DSL.table(DSL.name(Arrays.copyOf(name.getName(), name.getName().length - 1))) + : null; } // ------------------------------------------------------------------------ @@ -75,4 +84,9 @@ class QualifiedField extends AbstractField { public final void accept(Context ctx) { ctx.visit(name); } + + @Override + public final Table getTable() { + return table; + } }