diff --git a/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/Conditions.java b/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/Conditions.java index 1da58481..fcc99990 100644 --- a/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/Conditions.java +++ b/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/Conditions.java @@ -57,6 +57,17 @@ public abstract class Conditions { return new NestedCondition(condition); } + /** + * Creates a NOT {@link Condition} that reverses the condition. + * + * @param condition the condition to {@code NOT}. + * @return a NOT {@link Condition}. + * @since 3.1.6 + */ + public static Condition not(Condition condition) { + return new Not(condition); + } + /** * Creates a {@code IS NULL} condition. * 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 index 6a9e129d..23157964 100644 --- 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 @@ -1,5 +1,5 @@ /* - * Copyright 2019-2023 the original author or authors. + * Copyright 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. @@ -25,7 +25,7 @@ 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 + * @since 3.1.6 */ class NotConditionVisitor extends TypedSubtreeVisitor { 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 a65a69ce..3ec3f0d0 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 @@ -149,7 +149,8 @@ class SelectRendererUnitTests { Select select = Select.builder().select(employee.column("id"), department.column("name")) // .from(employee) // - .join(department, Join.JoinType.FULL_OUTER_JOIN).on(employee.column("department_id")).equals(department.column("id")) // + .join(department, Join.JoinType.FULL_OUTER_JOIN).on(employee.column("department_id")) + .equals(department.column("id")) // .build(); assertThat(SqlRenderer.toString(select)).isEqualTo("SELECT employee.id, department.name FROM employee " @@ -253,11 +254,9 @@ class SelectRendererUnitTests { Table merchantCustomers = Table.create("merchants_customers"); Table customerDetails = Table.create("customer_details"); - Select innerSelect = Select.builder() - .select(customerDetails.column("cd_user_id")) - .from(customerDetails).join(merchantCustomers) - .on(merchantCustomers.column("mc_user_id").isEqualTo(customerDetails.column("cd_user_id"))) - .build(); + Select innerSelect = Select.builder().select(customerDetails.column("cd_user_id")).from(customerDetails) + .join(merchantCustomers) + .on(merchantCustomers.column("mc_user_id").isEqualTo(customerDetails.column("cd_user_id"))).build(); InlineQuery innerTable = InlineQuery.create(innerSelect, "inner"); @@ -285,8 +284,7 @@ class SelectRendererUnitTests { Select innerSelectOne = Select.builder() .select(employee.column("id").as("empId"), employee.column("department_Id"), employee.column("name")) - .from(employee) - .build(); + .from(employee).build(); Select innerSelectTwo = Select.builder().select(department.column("id"), department.column("name")).from(department) .build(); @@ -621,16 +619,23 @@ class SelectRendererUnitTests { } @Test // GH-1653 - void notOfNested(){ + 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(); + 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)"); + + select = StatementBuilder.select(table.asterisk()).from(table).where(Conditions.not(Conditions.nest( + table.column("id").isEqualTo(Expressions.just("1")).and(table.column("id").isEqualTo(Expressions.just("2")))))) + .build(); + sql = SqlRenderer.toString(select); + + assertThat(sql).isEqualTo("SELECT atable.* FROM atable WHERE NOT (atable.id = 1 AND atable.id = 2)"); } /** @@ -734,8 +739,7 @@ class SelectRendererUnitTests { String rendered = SqlRenderer.toString(select); - assertThat(rendered).isEqualTo( - "SELECT ROW_NUMBER() OVER(PARTITION BY employee.department) FROM employee"); + assertThat(rendered).isEqualTo("SELECT ROW_NUMBER() OVER(PARTITION BY employee.department) FROM employee"); } } }