diff --git a/pom.xml b/pom.xml
index d9ee91c910..c5510ebd70 100644
--- a/pom.xml
+++ b/pom.xml
@@ -5,7 +5,7 @@
org.springframework.data
spring-data-relational-parent
- 3.2.0-SNAPSHOT
+ 3.2.0-1653-where-not-SNAPSHOT
pom
Spring Data Relational Parent
diff --git a/spring-data-jdbc-distribution/pom.xml b/spring-data-jdbc-distribution/pom.xml
index 271486f02a..3c746e7b89 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
- 3.2.0-SNAPSHOT
+ 3.2.0-1653-where-not-SNAPSHOT
../pom.xml
diff --git a/spring-data-jdbc/pom.xml b/spring-data-jdbc/pom.xml
index 2ac75e7993..e6da0263b4 100644
--- a/spring-data-jdbc/pom.xml
+++ b/spring-data-jdbc/pom.xml
@@ -6,7 +6,7 @@
4.0.0
spring-data-jdbc
- 3.2.0-SNAPSHOT
+ 3.2.0-1653-where-not-SNAPSHOT
Spring Data JDBC
Spring Data module for JDBC repositories.
@@ -15,7 +15,7 @@
org.springframework.data
spring-data-relational-parent
- 3.2.0-SNAPSHOT
+ 3.2.0-1653-where-not-SNAPSHOT
diff --git a/spring-data-r2dbc/pom.xml b/spring-data-r2dbc/pom.xml
index d65f06a082..32a10fcc9e 100644
--- a/spring-data-r2dbc/pom.xml
+++ b/spring-data-r2dbc/pom.xml
@@ -6,7 +6,7 @@
4.0.0
spring-data-r2dbc
- 3.2.0-SNAPSHOT
+ 3.2.0-1653-where-not-SNAPSHOT
Spring Data R2DBC
Spring Data module for R2DBC
@@ -15,7 +15,7 @@
org.springframework.data
spring-data-relational-parent
- 3.2.0-SNAPSHOT
+ 3.2.0-1653-where-not-SNAPSHOT
diff --git a/spring-data-relational/pom.xml b/spring-data-relational/pom.xml
index 74f350faa8..436c3def41 100644
--- a/spring-data-relational/pom.xml
+++ b/spring-data-relational/pom.xml
@@ -6,7 +6,7 @@
4.0.0
spring-data-relational
- 3.2.0-SNAPSHOT
+ 3.2.0-1653-where-not-SNAPSHOT
Spring Data Relational
Spring Data Relational support
@@ -14,7 +14,7 @@
org.springframework.data
spring-data-relational-parent
- 3.2.0-SNAPSHOT
+ 3.2.0-1653-where-not-SNAPSHOT
diff --git a/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/ConditionVisitor.java b/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/ConditionVisitor.java
index 42c51fe1bb..05be6d241e 100644
--- a/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/ConditionVisitor.java
+++ b/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/ConditionVisitor.java
@@ -15,16 +15,7 @@
*/
package org.springframework.data.relational.core.sql.render;
-import org.springframework.data.relational.core.sql.AndCondition;
-import org.springframework.data.relational.core.sql.Between;
-import org.springframework.data.relational.core.sql.Comparison;
-import org.springframework.data.relational.core.sql.Condition;
-import org.springframework.data.relational.core.sql.ConstantCondition;
-import org.springframework.data.relational.core.sql.In;
-import org.springframework.data.relational.core.sql.IsNull;
-import org.springframework.data.relational.core.sql.Like;
-import org.springframework.data.relational.core.sql.NestedCondition;
-import org.springframework.data.relational.core.sql.OrCondition;
+import org.springframework.data.relational.core.sql.*;
import org.springframework.lang.Nullable;
/**
@@ -103,6 +94,10 @@ private DelegatingVisitor getDelegation(Condition segment) {
return new ConstantConditionVisitor(context, builder::append);
}
+ if (segment instanceof Not) {
+ return new NotConditionVisitor(context, builder::append);
+ }
+
return null;
}
diff --git a/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/NotConditionVisitor.java b/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/NotConditionVisitor.java
new file mode 100644
index 0000000000..6a9e129df3
--- /dev/null
+++ b/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/NotConditionVisitor.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2019-2023 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.springframework.data.relational.core.sql.render;
+
+import org.springframework.data.relational.core.sql.Condition;
+import org.springframework.data.relational.core.sql.NestedCondition;
+import org.springframework.data.relational.core.sql.Not;
+import org.springframework.data.relational.core.sql.Visitable;
+import org.springframework.lang.Nullable;
+
+/**
+ * Renderer for {@link Not}. Uses a {@link RenderTarget} to call back for render results.
+ *
+ * @author Jens Schauder
+ * @since 3.2
+ */
+class NotConditionVisitor extends TypedSubtreeVisitor {
+
+ private final RenderContext context;
+ private final RenderTarget target;
+
+ private @Nullable ConditionVisitor conditionVisitor;
+
+ NotConditionVisitor(RenderContext context, RenderTarget target) {
+
+ this.context = context;
+ this.target = target;
+ }
+
+ @Override
+ Delegation enterNested(Visitable segment) {
+
+ DelegatingVisitor visitor = getDelegation(segment);
+
+ return visitor != null ? Delegation.delegateTo(visitor) : Delegation.retain();
+ }
+
+ @Nullable
+ private DelegatingVisitor getDelegation(Visitable segment) {
+
+ if (segment instanceof Condition) {
+ return conditionVisitor = new ConditionVisitor(context);
+ }
+
+ return null;
+ }
+
+ @Override
+ Delegation leaveNested(Visitable segment) {
+
+ if (conditionVisitor != null) {
+
+ target.onRendered("NOT (" + conditionVisitor.getRenderedPart() + ")");
+ conditionVisitor = null;
+ }
+
+ return super.leaveNested(segment);
+ }
+}
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 d3277b84e2..035670570a 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
@@ -635,6 +635,19 @@ void rendersAliasedExpression() {
.isEqualTo("SELECT table.name AS alias FROM table");
}
+ @Test // GH-1653
+ void notOfNested(){
+
+ Table table = SQL.table("atable");
+
+ Select select = StatementBuilder.select(table.asterisk()).from(table). where(
+ Conditions.nest(table.column("id").isEqualTo(Expressions.just("1"))
+ .and(table.column("id").isEqualTo(Expressions.just("2")))).not()).build();
+ String sql = SqlRenderer.toString(select);
+
+ assertThat(sql).isEqualTo("SELECT atable.* FROM atable WHERE NOT (atable.id = 1 AND atable.id = 2)");
+ }
+
/**
* Tests the rendering of analytic functions.
*/