diff --git a/pom.xml b/pom.xml
index eeaa0b9e93..25931a0b85 100644
--- a/pom.xml
+++ b/pom.xml
@@ -5,7 +5,7 @@
org.springframework.data
spring-data-relational-parent
- 2.3.0-SNAPSHOT
+ 2.3.0-995-non-trivial-join-condition-SNAPSHOT
pom
Spring Data Relational Parent
diff --git a/spring-data-jdbc-distribution/pom.xml b/spring-data-jdbc-distribution/pom.xml
index 03d6a5c2a0..25b6e85f9d 100644
--- a/spring-data-jdbc-distribution/pom.xml
+++ b/spring-data-jdbc-distribution/pom.xml
@@ -14,7 +14,7 @@
org.springframework.data
spring-data-relational-parent
- 2.3.0-SNAPSHOT
+ 2.3.0-995-non-trivial-join-condition-SNAPSHOT
../pom.xml
diff --git a/spring-data-jdbc/pom.xml b/spring-data-jdbc/pom.xml
index af9ad0904e..3a77c34716 100644
--- a/spring-data-jdbc/pom.xml
+++ b/spring-data-jdbc/pom.xml
@@ -6,7 +6,7 @@
4.0.0
spring-data-jdbc
- 2.3.0-SNAPSHOT
+ 2.3.0-995-non-trivial-join-condition-SNAPSHOT
Spring Data JDBC
Spring Data module for JDBC repositories.
@@ -15,7 +15,7 @@
org.springframework.data
spring-data-relational-parent
- 2.3.0-SNAPSHOT
+ 2.3.0-995-non-trivial-join-condition-SNAPSHOT
diff --git a/spring-data-relational/pom.xml b/spring-data-relational/pom.xml
index 4e42a006ec..f34912d6c1 100644
--- a/spring-data-relational/pom.xml
+++ b/spring-data-relational/pom.xml
@@ -6,7 +6,7 @@
4.0.0
spring-data-relational
- 2.3.0-SNAPSHOT
+ 2.3.0-995-non-trivial-join-condition-SNAPSHOT
Spring Data Relational
Spring Data Relational support
@@ -14,7 +14,7 @@
org.springframework.data
spring-data-relational-parent
- 2.3.0-SNAPSHOT
+ 2.3.0-995-non-trivial-join-condition-SNAPSHOT
diff --git a/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/DefaultSelectBuilder.java b/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/DefaultSelectBuilder.java
index 49ff3a2a05..6e590eae1f 100644
--- a/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/DefaultSelectBuilder.java
+++ b/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/DefaultSelectBuilder.java
@@ -325,6 +325,18 @@ public SelectOnConditionComparison on(Expression column) {
return this;
}
+ @Override
+ public SelectFromAndJoinCondition on(Condition condition) {
+
+ if (this.condition == null) {
+ this.condition = condition;
+ } else {
+ this.condition = this.condition.and(condition);
+ }
+
+ return this;
+ }
+
/*
* (non-Javadoc)
* @see org.springframework.data.relational.core.sql.SelectBuilder.SelectOnConditionComparison#equals(org.springframework.data.relational.core.sql.Expression)
@@ -348,6 +360,12 @@ public SelectOnConditionComparison and(Expression column) {
}
private void finishCondition() {
+
+ // Nothing to do if a complete join condition was used.
+ if (from == null && to == null) {
+ return;
+ }
+
Comparison comparison = Comparison.create(from, "=", to);
if (condition == null) {
diff --git a/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/SelectBuilder.java b/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/SelectBuilder.java
index edb7b8fbed..0b701f72f1 100644
--- a/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/SelectBuilder.java
+++ b/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/SelectBuilder.java
@@ -501,6 +501,17 @@ interface SelectOn {
* @see Table#column(String)
*/
SelectOnConditionComparison on(Expression column);
+
+ /**
+ * Declare a join condition in one step.
+ *
+ * Using conditions allows more flexibility in comparison to {@link #on(Expression)} which only allows for equality comparisons chained together with `AND`.
+ *
+ * @param condition must not be {@literal null}.
+ * @return {@code this} builder.
+ * @see Conditions
+ */
+ SelectFromAndJoinCondition on(Condition condition);
}
/**
diff --git a/spring-data-relational/src/test/java/org/springframework/data/relational/core/sql/render/SelectRendererUnitTests.java b/spring-data-relational/src/test/java/org/springframework/data/relational/core/sql/render/SelectRendererUnitTests.java
index 0394d4babd..c28f0087d4 100644
--- a/spring-data-relational/src/test/java/org/springframework/data/relational/core/sql/render/SelectRendererUnitTests.java
+++ b/spring-data-relational/src/test/java/org/springframework/data/relational/core/sql/render/SelectRendererUnitTests.java
@@ -156,6 +156,28 @@ void shouldRenderSimpleJoinWithAnd() {
+ "AND employee.tenant = department.tenant");
}
+ @Test // GH-995
+ public void shouldRenderArbitraryJoinCondition() {
+
+ Table employee = SQL.table("employee");
+ Table department = SQL.table("department");
+
+ Select select = Select.builder() //
+ .select(employee.column("id"), department.column("name")) //
+ .from(employee) //
+ .join(department) //
+ .on(
+ Conditions.isEqual( employee.column("department_id"),department.column("id")) //
+ .or( //
+ Conditions.isNotEqual( employee.column("tenant"),department.column("tenant")) //
+ )) //
+ .build();
+
+ assertThat(SqlRenderer.toString(select)).isEqualTo("SELECT employee.id, department.name FROM employee " //
+ + "JOIN department ON employee.department_id = department.id " //
+ + "OR employee.tenant != department.tenant");
+ }
+
@Test // DATAJDBC-309
void shouldRenderMultipleJoinWithAnd() {