Support conversion of elements in NOT_IN clause.

Closes #1744
Original pull request #1745
This commit is contained in:
七夜
2024-02-29 18:11:19 +08:00
committed by Jens Schauder
parent bba8dc291a
commit 4a787171e3
3 changed files with 28 additions and 7 deletions

View File

@@ -440,7 +440,7 @@ public class QueryMapper {
@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<Object> mapped = new ArrayList<>(collection.size());

View File

@@ -411,7 +411,7 @@ public class QueryMapper {
@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<Object> mapped = new ArrayList<>(collection.size());

View File

@@ -19,9 +19,7 @@ import static org.assertj.core.api.Assertions.*;
import static org.mockito.Mockito.*;
import static org.springframework.data.domain.Sort.Order.*;
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;
@@ -59,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);
QueryMapper createMapper(R2dbcDialect dialect, Converter<?, ?>... converters) {
R2dbcCustomConversions conversions = R2dbcCustomConversions.of(dialect, Arrays.asList(converters));
R2dbcMappingContext context = new R2dbcMappingContext();
context.setSimpleTypeHolder(conversions.getSimpleTypeHolder());
@@ -358,6 +358,18 @@ class QueryMapperUnitTests {
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() {
@@ -574,6 +586,15 @@ class QueryMapperUnitTests {
}
}
enum CollectionToStringConverter implements Converter<Collection<?>, String> {
INSTANCE;
@Override
public String convert(Collection<?> source) {
return source.toString();
}
}
enum StringToJsonNodeConverter implements Converter<String, JsonNode> {
INSTANCE;