From 28c8d8f5f96d044a1fd4a98e7a2a730cd6f876bd Mon Sep 17 00:00:00 2001 From: Mark Paluch Date: Wed, 28 Jan 2026 09:57:52 +0100 Subject: [PATCH] Polishing. Reformat code. Add Kotlin test to verify Criteria usage. See #2226 Original pull request: #2227 --- .../data/relational/core/query/Criteria.java | 12 +++-- .../data/relational/core/query/Update.java | 4 +- .../core/query/CriteriaUnitTests.java | 34 ++++++++++++++ .../core/query/UpdateUnitTests.java | 11 +++-- .../core/query/CriteriaKtUnitTests.kt | 45 +++++++++++++++++++ src/main/antora/modules/ROOT/nav.adoc | 2 + .../ROOT/pages/jdbc/property-paths.adoc | 1 + .../ROOT/pages/r2dbc/property-paths.adoc | 1 + 8 files changed, 95 insertions(+), 15 deletions(-) create mode 100644 spring-data-relational/src/test/kotlin/org/springframework/data/relational/core/query/CriteriaKtUnitTests.kt create mode 100644 src/main/antora/modules/ROOT/pages/jdbc/property-paths.adoc create mode 100644 src/main/antora/modules/ROOT/pages/r2dbc/property-paths.adoc diff --git a/spring-data-relational/src/main/java/org/springframework/data/relational/core/query/Criteria.java b/spring-data-relational/src/main/java/org/springframework/data/relational/core/query/Criteria.java index 63b16bfd5..425648a4f 100644 --- a/spring-data-relational/src/main/java/org/springframework/data/relational/core/query/Criteria.java +++ b/spring-data-relational/src/main/java/org/springframework/data/relational/core/query/Criteria.java @@ -166,7 +166,7 @@ public class Criteria implements CriteriaDefinition { * @return a new {@link CriteriaStep} object to complete the first {@link Criteria}. * @since 4.1 */ - public static CriteriaStep where(TypedPropertyPath property) { + public static CriteriaStep where(TypedPropertyPath property) { return where(property.toDotPath()); } @@ -198,8 +198,8 @@ public class Criteria implements CriteriaDefinition { * @since 4.1 */ @CheckReturnValue - public CriteriaStep and(TypedPropertyPath property) { - return and(TypedPropertyPath.of(property).toDotPath()); + public CriteriaStep and(TypedPropertyPath property) { + return and(property.toDotPath()); } /** @@ -260,8 +260,8 @@ public class Criteria implements CriteriaDefinition { * @since 4.1 */ @CheckReturnValue - public CriteriaStep or(TypedPropertyPath property) { - return or(TypedPropertyPath.of(property).toDotPath()); + public CriteriaStep or(TypedPropertyPath property) { + return or(property.toDotPath()); } /** @@ -524,11 +524,9 @@ public class Criteria implements CriteriaDefinition { } SqlIdentifier column = criteria.getColumn(); - Assert.state(column != null, "Column must not be null"); Comparator comparator = criteria.getComparator(); - Assert.state(comparator != null, "Comparator must not be null"); stringBuilder.append(column.toSql(IdentifierProcessing.NONE)).append(' ').append(comparator.getComparator()); diff --git a/spring-data-relational/src/main/java/org/springframework/data/relational/core/query/Update.java b/spring-data-relational/src/main/java/org/springframework/data/relational/core/query/Update.java index b8dfd31a4..1e0284f7c 100644 --- a/spring-data-relational/src/main/java/org/springframework/data/relational/core/query/Update.java +++ b/spring-data-relational/src/main/java/org/springframework/data/relational/core/query/Update.java @@ -75,7 +75,7 @@ public class Update { * @return new instance of {@link Update}. * @since 4.1 */ - public static Update update(TypedPropertyPath property, @Nullable Object value) { + public static Update update(TypedPropertyPath property, @Nullable Object value) { return update(property.toDotPath(), value); } @@ -103,7 +103,7 @@ public class Update { * @since 4.1 */ @CheckReturnValue - public Update set(TypedPropertyPath property, @Nullable Object value) { + public Update set(TypedPropertyPath property, @Nullable Object value) { return set(property.toDotPath(), value); } diff --git a/spring-data-relational/src/test/java/org/springframework/data/relational/core/query/CriteriaUnitTests.java b/spring-data-relational/src/test/java/org/springframework/data/relational/core/query/CriteriaUnitTests.java index 9e594bd3e..0a54f8d06 100644 --- a/spring-data-relational/src/test/java/org/springframework/data/relational/core/query/CriteriaUnitTests.java +++ b/spring-data-relational/src/test/java/org/springframework/data/relational/core/query/CriteriaUnitTests.java @@ -30,6 +30,7 @@ import org.springframework.data.relational.core.sql.SqlIdentifier; * @author Mark Paluch * @author Jens Schauder * @author Roman Chigvintsev + * @author Christoph Strobl */ class CriteriaUnitTests { @@ -46,6 +47,11 @@ class CriteriaUnitTests { assertThat(criteria).hasToString("(foo IS NOT NULL AND foo IS NULL)"); } + @Test // GH-2226 + void whereWithTypedPropertyPathIsEqualToStringColumnName() { + assertThat(where(Person::getName).is("o")).isEqualTo(where("name").is("o")); + } + @Test // DATAJDBC-513 void fromCriteriaOptimized() { @@ -95,6 +101,13 @@ class CriteriaUnitTests { assertThat(criteria.getValue()).isEqualTo("bar"); } + @Test // GH-2226 + void andChainedCriteriaWithTypedPropertyPathIsEqualToStringColumnName() { + + assertThat(where(Person::getName).is("o").and(Person::getAge).isNotNull()) + .isEqualTo(where("name").is("o").and("age").isNotNull()); + } + @Test // DATAJDBC-513 void andGroupedCriteria() { @@ -131,6 +144,13 @@ class CriteriaUnitTests { assertThat(criteria.getValue()).isEqualTo("bar"); } + @Test // GH-2226 + void orChainedCriteriaWithTypedPropertyPathIsEqualToStringColumnName() { + + assertThat(where(Person::getName).is("o").or(Person::getAge).isNotNull()) + .isEqualTo(where("name").is("o").or("age").isNotNull()); + } + @Test // DATAJDBC-513 void orGroupedCriteria() { @@ -323,4 +343,18 @@ class CriteriaUnitTests { } } } + + static class Person { + + private String name; + private Integer age; + + public String getName() { + return name; + } + + public Integer getAge() { + return this.age; + } + } } diff --git a/spring-data-relational/src/test/java/org/springframework/data/relational/core/query/UpdateUnitTests.java b/spring-data-relational/src/test/java/org/springframework/data/relational/core/query/UpdateUnitTests.java index 1f56a6c5f..72746cece 100644 --- a/spring-data-relational/src/test/java/org/springframework/data/relational/core/query/UpdateUnitTests.java +++ b/spring-data-relational/src/test/java/org/springframework/data/relational/core/query/UpdateUnitTests.java @@ -15,10 +15,10 @@ */ package org.springframework.data.relational.core.query; -import org.junit.jupiter.api.Test; - import static org.assertj.core.api.Assertions.*; +import org.junit.jupiter.api.Test; + /** * Unit tests for {@link Update}. * @@ -28,13 +28,12 @@ import static org.assertj.core.api.Assertions.*; public class UpdateUnitTests { @Test // DATAJDBC-513 - public void shouldRenderUpdateToString() { - + void shouldRenderUpdateToString() { assertThat(Update.update("foo", "baz").set("bar", 42)).hasToString("SET foo = 'baz', bar = 42"); } @Test // GH-2226 - public void shouldRenderUpdateWithTypedPropertyPathToString() { + void shouldRenderUpdateWithTypedPropertyPathToString() { assertThat(Update.update(Person::getFirstName, "baz").set("bar", 42)).hasToString("SET firstName = 'baz', bar = 42"); } @@ -42,7 +41,7 @@ public class UpdateUnitTests { private String firstName; private String lastName; - public String getFirstName() { + String getFirstName() { return firstName; } diff --git a/spring-data-relational/src/test/kotlin/org/springframework/data/relational/core/query/CriteriaKtUnitTests.kt b/spring-data-relational/src/test/kotlin/org/springframework/data/relational/core/query/CriteriaKtUnitTests.kt new file mode 100644 index 000000000..fd3dd7923 --- /dev/null +++ b/spring-data-relational/src/test/kotlin/org/springframework/data/relational/core/query/CriteriaKtUnitTests.kt @@ -0,0 +1,45 @@ +/* + * Copyright 2026-present 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.query + +import org.assertj.core.api.Assertions.assertThat +import org.junit.jupiter.api.Test +import org.springframework.data.core.div + +/** + * Kotlin unit tests for [Criteria]. + * + * @author Mark Paluch + */ +class CriteriaKtUnitTests { + + @Test + fun shouldAcceptKProperty() { + assertThat( + Criteria.where(Person::lastName).isEqual("foo") + ).isEqualTo(Criteria.where("lastName").isEqual("foo")) + } + + @Test + fun shouldAcceptKPropertyPath() { + assertThat( + Criteria.where(Person::parent / Person::lastName).isEqual("foo") + ).isEqualTo(Criteria.where("parent.lastName").isEqual("foo")) + } + + data class Person(val firstName: String, val lastName: String, val parent: Person) + +} diff --git a/src/main/antora/modules/ROOT/nav.adoc b/src/main/antora/modules/ROOT/nav.adoc index f63a4c08b..26fe8d009 100644 --- a/src/main/antora/modules/ROOT/nav.adoc +++ b/src/main/antora/modules/ROOT/nav.adoc @@ -26,6 +26,7 @@ ** xref:jdbc/entity-persistence.adoc[] ** xref:jdbc/sequences.adoc[] ** xref:jdbc/mapping.adoc[] +** xref:jdbc/property-paths.adoc[] ** xref:jdbc/query-methods.adoc[] ** xref:jdbc/mybatis.adoc[] ** xref:jdbc/events.adoc[] @@ -39,6 +40,7 @@ ** xref:r2dbc/entity-persistence.adoc[] ** xref:r2dbc/sequences.adoc[] ** xref:r2dbc/mapping.adoc[] +** xref:r2dbc/property-paths.adoc[] ** xref:r2dbc/repositories.adoc[] ** xref:r2dbc/query-methods.adoc[] ** xref:r2dbc/entity-callbacks.adoc[] diff --git a/src/main/antora/modules/ROOT/pages/jdbc/property-paths.adoc b/src/main/antora/modules/ROOT/pages/jdbc/property-paths.adoc new file mode 100644 index 000000000..128d921c8 --- /dev/null +++ b/src/main/antora/modules/ROOT/pages/jdbc/property-paths.adoc @@ -0,0 +1 @@ +include::{commons}@data-commons::page$property-paths.adoc[] diff --git a/src/main/antora/modules/ROOT/pages/r2dbc/property-paths.adoc b/src/main/antora/modules/ROOT/pages/r2dbc/property-paths.adoc new file mode 100644 index 000000000..128d921c8 --- /dev/null +++ b/src/main/antora/modules/ROOT/pages/r2dbc/property-paths.adoc @@ -0,0 +1 @@ +include::{commons}@data-commons::page$property-paths.adoc[]