From 28f376f02c59e645cd79404347ed2c4b92f5f0e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=83=E5=A4=9C?= Date: Thu, 29 Feb 2024 18:11:19 +0800 Subject: [PATCH 1/3] Add NOT_IN judgment to QueryMapper's convertValue function --- .../org/springframework/data/jdbc/core/convert/QueryMapper.java | 2 +- .../java/org/springframework/data/r2dbc/query/QueryMapper.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/convert/QueryMapper.java b/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/convert/QueryMapper.java index 817ad88e98..3ab54cc5f4 100644 --- a/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/convert/QueryMapper.java +++ b/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/convert/QueryMapper.java @@ -440,7 +440,7 @@ private Condition mapEmbeddedObjectCondition(CriteriaDefinition criteria, MapSql @Nullable private Object convertValue(Comparator comparator, @Nullable Object value, TypeInformation typeHint) { - if (Comparator.IN.equals(comparator) && value instanceof Collection collection && !collection.isEmpty()) { + if ((Comparator.IN.equals(comparator) || Comparator.NOT_IN.equals(comparator)) && value instanceof Collection collection && !collection.isEmpty()) { Collection mapped = new ArrayList<>(collection.size()); diff --git a/spring-data-r2dbc/src/main/java/org/springframework/data/r2dbc/query/QueryMapper.java b/spring-data-r2dbc/src/main/java/org/springframework/data/r2dbc/query/QueryMapper.java index 5174799a79..ffc3dbb499 100644 --- a/spring-data-r2dbc/src/main/java/org/springframework/data/r2dbc/query/QueryMapper.java +++ b/spring-data-r2dbc/src/main/java/org/springframework/data/r2dbc/query/QueryMapper.java @@ -411,7 +411,7 @@ public Parameter getBindValue(Parameter value) { @Nullable private Object convertValue(Comparator comparator, @Nullable Object value, TypeInformation typeHint) { - if (Comparator.IN.equals(comparator) && value instanceof Collection collection && !collection.isEmpty()) { + if ((Comparator.IN.equals(comparator) || Comparator.NOT_IN.equals(comparator)) && value instanceof Collection collection && !collection.isEmpty()) { Collection mapped = new ArrayList<>(collection.size()); From c294005477d9c0b42b0abdd2418a5432a5c8f319 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=83=E5=A4=9C?= Date: Mon, 4 Mar 2024 21:33:04 +0800 Subject: [PATCH 2/3] add convert to unit test on QueryMapper, shouldMapIsNotIn not pass on oldVersion, passed on current --- .../data/r2dbc/query/QueryMapperUnitTests.java | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/query/QueryMapperUnitTests.java b/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/query/QueryMapperUnitTests.java index 26f203c809..551fd9c2b7 100644 --- a/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/query/QueryMapperUnitTests.java +++ b/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/query/QueryMapperUnitTests.java @@ -19,6 +19,7 @@ import static org.mockito.Mockito.*; import static org.springframework.data.domain.Sort.Order.*; +import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Objects; @@ -61,7 +62,7 @@ class QueryMapperUnitTests { QueryMapper createMapper(R2dbcDialect dialect) { R2dbcCustomConversions conversions = R2dbcCustomConversions.of(dialect, JsonNodeToStringConverter.INSTANCE, - StringToJsonNodeConverter.INSTANCE); + StringToJsonNodeConverter.INSTANCE, CollectionToStringConverter.INSTANCE); R2dbcMappingContext context = new R2dbcMappingContext(); context.setSimpleTypeHolder(conversions.getSimpleTypeHolder()); @@ -574,6 +575,15 @@ public String convert(JsonNode source) { } } + enum CollectionToStringConverter implements Converter, String> { + INSTANCE; + @Override + public String convert(Collection source) { + return source.toString(); + } + } + + enum StringToJsonNodeConverter implements Converter { INSTANCE; From 1eeddc14f8f63dcb89652c0124b6a9fa0885f19f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=83=E5=A4=9C?= Date: Tue, 5 Mar 2024 10:54:46 +0800 Subject: [PATCH 3/3] Added test cases, NotIn can also work normally with CollectionToString converter --- .../r2dbc/query/QueryMapperUnitTests.java | 23 ++++++++++++++----- 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/query/QueryMapperUnitTests.java b/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/query/QueryMapperUnitTests.java index 551fd9c2b7..c9ac48e043 100644 --- a/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/query/QueryMapperUnitTests.java +++ b/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/query/QueryMapperUnitTests.java @@ -19,10 +19,7 @@ import static org.mockito.Mockito.*; import static org.springframework.data.domain.Sort.Order.*; -import java.util.Collection; -import java.util.Collections; -import java.util.List; -import java.util.Objects; +import java.util.*; import org.junit.jupiter.api.Test; import org.springframework.core.convert.converter.Converter; @@ -60,9 +57,11 @@ class QueryMapperUnitTests { private QueryMapper mapper = createMapper(PostgresDialect.INSTANCE); QueryMapper createMapper(R2dbcDialect dialect) { + return createMapper(dialect, JsonNodeToStringConverter.INSTANCE, StringToJsonNodeConverter.INSTANCE); + } - R2dbcCustomConversions conversions = R2dbcCustomConversions.of(dialect, JsonNodeToStringConverter.INSTANCE, - StringToJsonNodeConverter.INSTANCE, CollectionToStringConverter.INSTANCE); + QueryMapper createMapper(R2dbcDialect dialect, Converter... converters) { + R2dbcCustomConversions conversions = R2dbcCustomConversions.of(dialect, Arrays.asList(converters)); R2dbcMappingContext context = new R2dbcMappingContext(); context.setSimpleTypeHolder(conversions.getSimpleTypeHolder()); @@ -359,6 +358,18 @@ void shouldMapIsNotIn() { assertThat(bindings.getCondition()).hasToString("person.name NOT IN (?[$1], ?[$2], ?[$3])"); } + @Test + void sholdMapIsNotInWithCollectionToStringConverter() { + + mapper = createMapper(PostgresDialect.INSTANCE, JsonNodeToStringConverter.INSTANCE, StringToJsonNodeConverter.INSTANCE, CollectionToStringConverter.INSTANCE); + + Criteria criteria = Criteria.where("name").notIn("a", "b", "c"); + + BoundCondition bindings = map(criteria); + + assertThat(bindings.getCondition()).hasToString("person.name NOT IN (?[$1], ?[$2], ?[$3])"); + } + @Test // gh-64 void shouldMapIsGt() {