diff --git a/jOOQ/src/main/java/org/jooq/Table.java b/jOOQ/src/main/java/org/jooq/Table.java index 331e71abf2..618690e160 100644 --- a/jOOQ/src/main/java/org/jooq/Table.java +++ b/jOOQ/src/main/java/org/jooq/Table.java @@ -265,6 +265,8 @@ public interface Table extends TableLike, Qualified { /** * Get a list of FOREIGN KEY's of a specific table, referencing * a this table. + *

+ * This will recurse into joined tables. * * @param The other table's record type * @param other The other table of the foreign key relationship @@ -287,6 +289,8 @@ public interface Table extends TableLike, Qualified { /** * Get a list of FOREIGN KEY's of this table, referencing a * specific table. + *

+ * This will recurse into joined tables. * * @param The other table's record type * @param other The other table of the foreign key relationship diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractTable.java b/jOOQ/src/main/java/org/jooq/impl/AbstractTable.java index 891d8ec243..f449f888a0 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractTable.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractTable.java @@ -520,22 +520,39 @@ abstract class AbstractTable extends AbstractNamed implements List> result = new ArrayList<>(); for (ForeignKey reference : getReferences()) { - if (other.equals(reference.getKey().getTable())) { - result.add((ForeignKey) reference); - } - - // [#1460] [#6304] In case the other table was aliased - else { - Table aliased = Tools.aliased(other); - - if (aliased != null && aliased.equals(reference.getKey().getTable())) { + for (Table o : flattenJoins(other)) { + if (o.equals(reference.getKey().getTable())) { result.add((ForeignKey) reference); } + + // [#1460] [#6304] In case the other table was aliased + else { + Table aliased = Tools.aliased(o); + + if (aliased != null && aliased.equals(reference.getKey().getTable())) + result.add((ForeignKey) reference); + } } } return Collections.unmodifiableList(result); } + + private final List> flattenJoins(Table other) { + return flattenJoins(other, new ArrayList<>()); + } + + private final List> flattenJoins(Table other, List> list) { + if (other instanceof JoinTable) { + flattenJoins(((JoinTable) other).lhs, list); + flattenJoins(((JoinTable) other).rhs, list); + } + else + list.add(other); + + return list; + } + /** * {@inheritDoc} *

diff --git a/jOOQ/src/main/java/org/jooq/impl/JoinTable.java b/jOOQ/src/main/java/org/jooq/impl/JoinTable.java index 9817f0584f..6711990430 100755 --- a/jOOQ/src/main/java/org/jooq/impl/JoinTable.java +++ b/jOOQ/src/main/java/org/jooq/impl/JoinTable.java @@ -645,12 +645,10 @@ implements List leftToRight = lhs.getReferencesTo(rhs); List rightToLeft = rhs.getReferencesTo(lhs); - if (leftToRight.size() == 1 && rightToLeft.size() == 0) { + if (leftToRight.size() == 1 && rightToLeft.size() == 0) return onKey((ForeignKey) leftToRight.get(0), lhs, rhs); - } - else if (rightToLeft.size() == 1 && leftToRight.size() == 0) { + else if (rightToLeft.size() == 1 && leftToRight.size() == 0) return onKey((ForeignKey) rightToLeft.get(0), rhs, lhs); - } if (rightToLeft.isEmpty() && leftToRight.isEmpty()) throw onKeyException(OnKeyExceptionReason.NOT_FOUND, leftToRight, rightToLeft);