From f7cdad92b0c6f26090e62f72d97ff0f1c1d2176b Mon Sep 17 00:00:00 2001 From: Mark Paluch Date: Tue, 28 Jun 2022 10:00:27 +0200 Subject: [PATCH] Fix argument conversion in `QuerydslPredicateBuilder`. We now consider the correct argument type instead of checking assignability of the actual property type against the input value. Closes: #2649 Original Pull Request: #2650 --- .../querydsl/binding/QuerydslPredicateBuilder.java | 13 ++++++------- .../binding/QuerydslPredicateBuilderUnitTests.java | 13 +++++++++++++ 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/springframework/data/querydsl/binding/QuerydslPredicateBuilder.java b/src/main/java/org/springframework/data/querydsl/binding/QuerydslPredicateBuilder.java index fc4baa8e1..0d6d617dd 100644 --- a/src/main/java/org/springframework/data/querydsl/binding/QuerydslPredicateBuilder.java +++ b/src/main/java/org/springframework/data/querydsl/binding/QuerydslPredicateBuilder.java @@ -176,30 +176,29 @@ public class QuerydslPredicateBuilder { */ private Collection convertToPropertyPathSpecificType(List source, PathInformation path) { - Class targetType = path.getLeafType(); - if (source.isEmpty() || isSingleElementCollectionWithEmptyItem(source)) { return Collections.emptyList(); } + TypeDescriptor targetType = getTargetTypeDescriptor(path); Collection target = new ArrayList<>(source.size()); for (Object value : source) { - target.add(getValue(path, targetType, value)); + target.add(getValue(targetType, value)); } return target; } @Nullable - private Object getValue(PathInformation path, Class targetType, Object value) { + private Object getValue(TypeDescriptor targetType, Object value) { - if (ClassUtils.isAssignableValue(targetType, value)) { + if (ClassUtils.isAssignableValue(targetType.getType(), value)) { return value; } - if (conversionService.canConvert(value.getClass(), targetType)) { - return conversionService.convert(value, TypeDescriptor.forObject(value), getTargetTypeDescriptor(path)); + if (conversionService.canConvert(value.getClass(), targetType.getType())) { + return conversionService.convert(value, TypeDescriptor.forObject(value), targetType); } return value; diff --git a/src/test/java/org/springframework/data/querydsl/binding/QuerydslPredicateBuilderUnitTests.java b/src/test/java/org/springframework/data/querydsl/binding/QuerydslPredicateBuilderUnitTests.java index 45aa8cd8b..1488b5fa2 100755 --- a/src/test/java/org/springframework/data/querydsl/binding/QuerydslPredicateBuilderUnitTests.java +++ b/src/test/java/org/springframework/data/querydsl/binding/QuerydslPredicateBuilderUnitTests.java @@ -20,6 +20,7 @@ import static org.assertj.core.api.Assumptions.*; import static org.springframework.test.util.ReflectionTestUtils.*; import java.text.ParseException; +import java.util.Arrays; import java.util.List; import org.joda.time.DateTime; @@ -198,6 +199,18 @@ class QuerydslPredicateBuilderUnitTests { assertThat(predicate).isEqualTo(QUser.user.dateOfBirth.eq(format.parseDateTime(date).toDate())); } + @Test + void resolvesCommaSeparatedArgumentToListCorrectly() { + + values.add("nickNames", "Walt,Heisenberg"); + + Predicate predicate = builder.getPredicate(USER_TYPE, values, DEFAULT_BINDINGS); + + Constant constant = (Constant) ((List) getField(getField(predicate, "mixin"), "args")).get(0); + + assertThat(constant.getConstant()).isEqualTo(Arrays.asList("Walt", "Heisenberg")); + } + @Test // DATACMNS-883 void automaticallyInsertsAnyStepInCollectionReference() {