Skip to content

Commit 4a78717

Browse files
七夜schauder
七夜
authored andcommitted
Support conversion of elements in NOT_IN clause.
Closes #1744 Original pull request #1745
1 parent bba8dc2 commit 4a78717

File tree

3 files changed

+28
-7
lines changed

3 files changed

+28
-7
lines changed

spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/convert/QueryMapper.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -440,7 +440,7 @@ private Condition mapEmbeddedObjectCondition(CriteriaDefinition criteria, MapSql
440440
@Nullable
441441
private Object convertValue(Comparator comparator, @Nullable Object value, TypeInformation<?> typeHint) {
442442

443-
if (Comparator.IN.equals(comparator) && value instanceof Collection<?> collection && !collection.isEmpty()) {
443+
if ((Comparator.IN.equals(comparator) || Comparator.NOT_IN.equals(comparator)) && value instanceof Collection<?> collection && !collection.isEmpty()) {
444444

445445
Collection<Object> mapped = new ArrayList<>(collection.size());
446446

spring-data-r2dbc/src/main/java/org/springframework/data/r2dbc/query/QueryMapper.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -411,7 +411,7 @@ public Parameter getBindValue(Parameter value) {
411411
@Nullable
412412
private Object convertValue(Comparator comparator, @Nullable Object value, TypeInformation<?> typeHint) {
413413

414-
if (Comparator.IN.equals(comparator) && value instanceof Collection<?> collection && !collection.isEmpty()) {
414+
if ((Comparator.IN.equals(comparator) || Comparator.NOT_IN.equals(comparator)) && value instanceof Collection<?> collection && !collection.isEmpty()) {
415415

416416
Collection<Object> mapped = new ArrayList<>(collection.size());
417417

spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/query/QueryMapperUnitTests.java

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,7 @@
1919
import static org.mockito.Mockito.*;
2020
import static org.springframework.data.domain.Sort.Order.*;
2121

22-
import java.util.Collections;
23-
import java.util.List;
24-
import java.util.Objects;
22+
import java.util.*;
2523

2624
import org.junit.jupiter.api.Test;
2725
import org.springframework.core.convert.converter.Converter;
@@ -59,9 +57,11 @@ class QueryMapperUnitTests {
5957
private QueryMapper mapper = createMapper(PostgresDialect.INSTANCE);
6058

6159
QueryMapper createMapper(R2dbcDialect dialect) {
60+
return createMapper(dialect, JsonNodeToStringConverter.INSTANCE, StringToJsonNodeConverter.INSTANCE);
61+
}
6262

63-
R2dbcCustomConversions conversions = R2dbcCustomConversions.of(dialect, JsonNodeToStringConverter.INSTANCE,
64-
StringToJsonNodeConverter.INSTANCE);
63+
QueryMapper createMapper(R2dbcDialect dialect, Converter<?, ?>... converters) {
64+
R2dbcCustomConversions conversions = R2dbcCustomConversions.of(dialect, Arrays.asList(converters));
6565

6666
R2dbcMappingContext context = new R2dbcMappingContext();
6767
context.setSimpleTypeHolder(conversions.getSimpleTypeHolder());
@@ -358,6 +358,18 @@ void shouldMapIsNotIn() {
358358
assertThat(bindings.getCondition()).hasToString("person.name NOT IN (?[$1], ?[$2], ?[$3])");
359359
}
360360

361+
@Test
362+
void sholdMapIsNotInWithCollectionToStringConverter() {
363+
364+
mapper = createMapper(PostgresDialect.INSTANCE, JsonNodeToStringConverter.INSTANCE, StringToJsonNodeConverter.INSTANCE, CollectionToStringConverter.INSTANCE);
365+
366+
Criteria criteria = Criteria.where("name").notIn("a", "b", "c");
367+
368+
BoundCondition bindings = map(criteria);
369+
370+
assertThat(bindings.getCondition()).hasToString("person.name NOT IN (?[$1], ?[$2], ?[$3])");
371+
}
372+
361373
@Test // gh-64
362374
void shouldMapIsGt() {
363375

@@ -574,6 +586,15 @@ public String convert(JsonNode source) {
574586
}
575587
}
576588

589+
enum CollectionToStringConverter implements Converter<Collection<?>, String> {
590+
INSTANCE;
591+
@Override
592+
public String convert(Collection<?> source) {
593+
return source.toString();
594+
}
595+
}
596+
597+
577598
enum StringToJsonNodeConverter implements Converter<String, JsonNode> {
578599
INSTANCE;
579600

0 commit comments

Comments
 (0)