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 9175963d6..1b7c6325a 100644 --- a/src/main/java/org/springframework/data/querydsl/binding/QuerydslPredicateBuilder.java +++ b/src/main/java/org/springframework/data/querydsl/binding/QuerydslPredicateBuilder.java @@ -191,7 +191,8 @@ public class QuerydslPredicateBuilder { */ private Collection convertToPropertyPathSpecificType(List source, PropertyPath path) { - Class targetType = path.getLeafProperty().getType(); + Class targetType = path.getLeafProperty().getOwningType().getProperty(path.getLeafProperty().getSegment()) + .getType(); if (source.isEmpty() || isSingleElementCollectionWithoutText(source)) { return Collections.emptyList(); @@ -201,8 +202,8 @@ public class QuerydslPredicateBuilder { for (String value : source) { - target.add(conversionService.canConvert(value.getClass(), targetType) - ? conversionService.convert(value, targetType) : value); + target.add(conversionService.canConvert(String.class, targetType) ? conversionService.convert( + targetType.isArray() ? value.split(",") : value, targetType) : value); } return target; diff --git a/src/test/java/org/springframework/data/querydsl/Address.java b/src/test/java/org/springframework/data/querydsl/Address.java index 703bfabcf..60ce4510c 100644 --- a/src/test/java/org/springframework/data/querydsl/Address.java +++ b/src/test/java/org/springframework/data/querydsl/Address.java @@ -24,6 +24,7 @@ import com.mysema.query.annotations.QueryEntity; public class Address { public String street, city; + public Double[] lonLat; public Address(String street, String city) { this.street = street; 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 87b5be713..a12721d17 100644 --- a/src/test/java/org/springframework/data/querydsl/binding/QuerydslPredicateBuilderUnitTests.java +++ b/src/test/java/org/springframework/data/querydsl/binding/QuerydslPredicateBuilderUnitTests.java @@ -16,8 +16,8 @@ package org.springframework.data.querydsl.binding; import static org.hamcrest.Matchers.*; -import static org.hamcrest.core.Is.is; import static org.junit.Assert.*; +import static org.springframework.test.util.ReflectionTestUtils.*; import java.util.List; @@ -28,14 +28,12 @@ import org.springframework.data.querydsl.QUser; import org.springframework.data.querydsl.SimpleEntityPathResolver; import org.springframework.data.querydsl.User; import org.springframework.data.querydsl.Users; -import org.springframework.data.querydsl.binding.QuerydslBindings; -import org.springframework.data.querydsl.binding.QuerydslPredicateBuilder; -import org.springframework.data.querydsl.binding.SingleValueBinding; import org.springframework.data.util.ClassTypeInformation; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; import com.mysema.query.collections.CollQueryFactory; +import com.mysema.query.types.Constant; import com.mysema.query.types.Predicate; import com.mysema.query.types.path.StringPath; @@ -153,4 +151,38 @@ public class QuerydslPredicateBuilderUnitTests { builder.getPredicate(USER_TYPE, values, bindings); } + + /** + * @see DATACMNS-734 + */ + @Test + @SuppressWarnings("unchecked") + public void resolvesCommaSeparatedArgumentToArrayCorrectly() { + + values.add("address.lonLat", "40.740337,-73.995146"); + + Predicate predicate = builder.getPredicate(USER_TYPE, values, DEFAULT_BINDINGS); + + Constant constant = (Constant) ((List) getField(getField(predicate, "mixin"), "args")).get(1); + + assertThat(constant.getConstant(), instanceOf(Double[].class)); + assertThat((Double[]) (constant.getConstant()), arrayContaining(40.740337D, -73.995146D)); + } + + /** + * @see DATACMNS-734 + */ + @Test + @SuppressWarnings("unchecked") + public void leavesCommaSeparatedArgumentUntouchedWhenTargetIsNotAnArray() { + + values.add("address.city", "rivers,two"); + + Predicate predicate = builder.getPredicate(USER_TYPE, values, DEFAULT_BINDINGS); + + Constant constant = (Constant) ((List) getField(getField(predicate, "mixin"), "args")).get(1); + + assertThat(constant.getConstant(), instanceOf(String.class)); + assertThat((String) (constant.getConstant()), equalTo("rivers,two")); + } }