Skip to content

Commit 4008ec8

Browse files
committed
Immediatly construct join conditions
1 parent 75cfb1c commit 4008ec8

File tree

3 files changed

+40
-55
lines changed

3 files changed

+40
-55
lines changed

spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/convert/SqlGenerator.java

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -608,13 +608,7 @@ private static SelectBuilder.SelectJoin addJoins(SelectBuilder.SelectJoin baseSe
608608

609609
for (Join join : joinTables) {
610610

611-
Condition condition = null;
612-
for (Pair<Column, Column> columnPair : join.columns) {
613-
Comparison elementalCondition = columnPair.getFirst().isEqualTo(columnPair.getSecond());
614-
condition = condition == null ? elementalCondition : condition.and(elementalCondition);
615-
}
616-
617-
baseSelect = baseSelect.leftOuterJoin(join.joinTable).on(Objects.requireNonNull(condition));
611+
baseSelect = baseSelect.leftOuterJoin(join.joinTable).on(join.condition);
618612
}
619613
return baseSelect;
620614
}
@@ -696,15 +690,19 @@ Join getJoin(AggregatePath path) {
696690
Table parentTable = sqlContext.getTable(idDefiningParentPath);
697691
AggregatePath.ColumnInfos idColumnInfos = idDefiningParentPath.getTableInfo().idColumnInfos();
698692

699-
List<Pair<Column, Column>> joinConditions = new ArrayList<>();
693+
final Condition[] joinCondition = { null };
700694
backRefColumnInfos.forEach((ap, ci) -> {
701-
joinConditions.add(Pair.of(currentTable.column(ci.name()), parentTable.column(idColumnInfos.get(ap).name())));
695+
696+
Condition elementalCondition = currentTable.column(ci.name())
697+
.isEqualTo(parentTable.column(idColumnInfos.get(ap).name()));
698+
joinCondition[0] = joinCondition[0] == null ? elementalCondition : joinCondition[0].and(elementalCondition);
702699
});
703700

704701
return new Join( //
705702
currentTable, //
706-
joinConditions //
703+
joinCondition[0] //
707704
);
705+
708706
}
709707

710708
private String createFindAllInListSql() {
@@ -1153,7 +1151,7 @@ SelectBuilder.SelectOrdered applyCriteria(@Nullable CriteriaDefinition criteria,
11531151
/**
11541152
* Value object representing a {@code JOIN} association.
11551153
*/
1156-
record Join(Table joinTable, List<Pair<Column, Column>> columns) {
1154+
record Join(Table joinTable, Condition condition) {
11571155
}
11581156

11591157
/**

spring-data-jdbc/src/test/java/org/springframework/data/jdbc/core/convert/SqlGeneratorEmbeddedUnitTests.java

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import org.springframework.data.relational.core.mapping.RelationalPersistentProperty;
3535
import org.springframework.data.relational.core.mapping.Table;
3636
import org.springframework.data.relational.core.sql.Aliased;
37+
import org.springframework.data.relational.core.sql.Conditions;
3738
import org.springframework.data.relational.core.sql.SqlIdentifier;
3839
import org.springframework.lang.Nullable;
3940

@@ -445,17 +446,18 @@ void joinForEmbeddedWithReference() {
445446

446447
assertSoftly(softly -> {
447448
softly.assertThat(join.joinTable().getName()).isEqualTo(SqlIdentifier.unquoted("other_entity"));
448-
softly.assertThat(join.columns()).extracting( //
449-
pair -> pair.getFirst().getTable(), //
450-
pair -> pair.getFirst().getName(), //
451-
pair -> pair.getSecond().getTable().getName(), //
452-
pair -> pair.getSecond().getName() //
453-
).contains(tuple( //
454-
join.joinTable(), //
455-
SqlIdentifier.unquoted("dummy_entity2"), //
456-
SqlIdentifier.unquoted("dummy_entity2"), //
457-
SqlIdentifier.unquoted("id") //
458-
));
449+
// softly.assertThat(join.columns()).extracting( //
450+
// pair -> pair.getFirst().getTable(), //
451+
// pair -> pair.getFirst().getName(), //
452+
// pair -> pair.getSecond().getTable().getName(), //
453+
// pair -> pair.getSecond().getName() //
454+
// ).contains(tuple( //
455+
// join.joinTable(), //
456+
// SqlIdentifier.unquoted("dummy_entity2"), //
457+
// SqlIdentifier.unquoted("dummy_entity2"), //
458+
// SqlIdentifier.unquoted("id") //
459+
// ));
460+
softly.assertThat(join.condition()).isEqualTo(org.springframework.data.relational.core.sql.Column.create("dummy_entity2", join.joinTable()).isEqualTo(org.springframework.data.relational.core.sql.Column.create("id", org.springframework.data.relational.core.sql.Table.create("dummy_entity2"))));
459461
});
460462
}
461463

spring-data-jdbc/src/test/java/org/springframework/data/jdbc/core/convert/SqlGeneratorUnitTests.java

Lines changed: 18 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -716,17 +716,11 @@ void joinForSimpleReference() {
716716
assertSoftly(softly -> {
717717

718718
softly.assertThat(join.joinTable().getName()).isEqualTo(SqlIdentifier.quoted("REFERENCED_ENTITY"));
719-
softly.assertThat(join.columns()).extracting( //
720-
pair -> pair.getFirst().getTable(), //
721-
pair -> pair.getFirst().getName(), //
722-
pair -> pair.getSecond().getTable().getName(), //
723-
pair -> pair.getSecond().getName() //
724-
).contains(tuple( //
725-
join.joinTable(), //
726-
SqlIdentifier.quoted("DUMMY_ENTITY"), //
727-
SqlIdentifier.quoted("DUMMY_ENTITY"), //
728-
SqlIdentifier.quoted("id1") //
729-
));
719+
softly.assertThat(join.condition())
720+
.isEqualTo(org.springframework.data.relational.core.sql.Column.create(SqlIdentifier.quoted("DUMMY_ENTITY"), join.joinTable())
721+
.isEqualTo(org.springframework.data.relational.core.sql.Column.create(SqlIdentifier.quoted("id1"),
722+
org.springframework.data.relational.core.sql.Table.create(SqlIdentifier.quoted("DUMMY_ENTITY")))));
723+
730724
});
731725
}
732726

@@ -754,17 +748,13 @@ void joinForSecondLevelReference() {
754748

755749
assertSoftly(softly -> {
756750
softly.assertThat(join.joinTable().getName()).isEqualTo(SqlIdentifier.quoted("SECOND_LEVEL_REFERENCED_ENTITY"));
757-
softly.assertThat(join.columns()).extracting( //
758-
pair -> pair.getFirst().getTable(), //
759-
pair -> pair.getFirst().getName(), //
760-
pair -> pair.getSecond().getTable().getName(), //
761-
pair -> pair.getSecond().getName() //
762-
).contains(tuple( //
763-
join.joinTable(), //
764-
SqlIdentifier.quoted("REFERENCED_ENTITY"), //
765-
SqlIdentifier.quoted("REFERENCED_ENTITY"), //
766-
SqlIdentifier.quoted("X_L1ID") //
767-
));
751+
softly.assertThat(join.condition())
752+
.isEqualTo(org.springframework.data.relational.core.sql.Column
753+
.create(SqlIdentifier.quoted("REFERENCED_ENTITY"), join.joinTable())
754+
.isEqualTo(org.springframework.data.relational.core.sql.Column.create(SqlIdentifier.quoted("X_L1ID"),
755+
org.springframework.data.relational.core.sql.Table.create("REFERENCED_ENTITY")
756+
.as(SqlIdentifier.quoted("ref")))));
757+
768758
});
769759
}
770760

@@ -779,18 +769,13 @@ void joinForOneToOneWithoutId() {
779769
softly.assertThat(joinTable.getName()).isEqualTo(SqlIdentifier.quoted("NO_ID_CHILD"));
780770
softly.assertThat(joinTable).isInstanceOf(Aliased.class);
781771
softly.assertThat(((Aliased) joinTable).getAlias()).isEqualTo(SqlIdentifier.quoted("child"));
772+
softly.assertThat(join.condition())
773+
.isEqualTo(org.springframework.data.relational.core.sql.Column
774+
.create(SqlIdentifier.quoted("PARENT_OF_NO_ID_CHILD"), join.joinTable())
775+
.isEqualTo(org.springframework.data.relational.core.sql.Column.create(SqlIdentifier.quoted("X_ID"),
776+
org.springframework.data.relational.core.sql.Table
777+
.create(SqlIdentifier.quoted("PARENT_OF_NO_ID_CHILD")))));
782778

783-
softly.assertThat(join.columns()).extracting( //
784-
pair -> pair.getFirst().getTable(), //
785-
pair -> pair.getFirst().getName(), //
786-
pair -> pair.getSecond().getTable().getName(), //
787-
pair -> pair.getSecond().getName() //
788-
).contains(tuple( //
789-
join.joinTable(), //
790-
SqlIdentifier.quoted("PARENT_OF_NO_ID_CHILD"), //
791-
SqlIdentifier.quoted("PARENT_OF_NO_ID_CHILD"), //
792-
SqlIdentifier.quoted("X_ID") //
793-
));
794779
});
795780
}
796781

0 commit comments

Comments
 (0)