From c15c9dcbfb4d936b35bb5e0323a56225fca02e13 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Fri, 26 Jun 2020 15:49:44 +0200 Subject: [PATCH] [jOOQ/jOOQ#7626] join(...).onKey(TableField) doesn't work with aliased tables --- .../main/java/org/jooq/impl/JoinTable.java | 28 +++++++++++++++---- 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/impl/JoinTable.java b/jOOQ/src/main/java/org/jooq/impl/JoinTable.java index f53c56818f..fc6e6fd880 100755 --- a/jOOQ/src/main/java/org/jooq/impl/JoinTable.java +++ b/jOOQ/src/main/java/org/jooq/impl/JoinTable.java @@ -661,16 +661,27 @@ implements @Override public final JoinTable onKey(TableField... keyFields) throws DataAccessException { if (keyFields != null && keyFields.length > 0) { + + // [#7626] Make sure this works with aliased columns as well + List> unaliased = new ArrayList<>(asList(keyFields)); + for (int i = 0; i < unaliased.size(); i++) { + TableField f = unaliased.get(i); + Alias> alias = Tools.alias(f.getTable()); + + if (alias != null) + unaliased.set(i, (TableField) alias.wrapped().field(f)); + } + if (search(lhs, keyFields[0].getTable()) != null) { for (ForeignKey key : lhs.getReferences()) { - if (key.getFields().containsAll(asList(keyFields))) { + if (key.getFields().containsAll(unaliased)) { return onKey(key); } } } else if (search(rhs, keyFields[0].getTable()) != null) { for (ForeignKey key : rhs.getReferences()) { - if (key.getFields().containsAll(asList(keyFields))) { + if (key.getFields().containsAll(unaliased)) { return onKey(key); } } @@ -692,10 +703,15 @@ implements private final Table search(Table tree, Table search) { - // [#6304] Improved alias discovery - Alias> alias = Tools.alias(tree); - if (alias != null) { - return search(alias.wrapped(), search); + // [#6304] [#7626] Improved alias discovery + Alias> treeAlias = Tools.alias(tree); + Alias> searchAlias = Tools.alias(search); + + if (treeAlias != null || searchAlias != null) { + return search( + treeAlias != null ? treeAlias.wrapped() : tree, + searchAlias != null ? searchAlias.wrapped() : search + ); } else if (tree instanceof JoinTable) { JoinTable t = (JoinTable) tree;