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;
+ }
}