Skip to content

Commit 9e94e11

Browse files
mp911dechristophstrobl
authored andcommitted
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
1 parent d25fd39 commit 9e94e11

File tree

2 files changed

+20
-8
lines changed

2 files changed

+20
-8
lines changed

src/main/java/org/springframework/data/querydsl/binding/QuerydslPredicateBuilder.java

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -175,30 +175,29 @@ private Path<?> getPath(PathInformation path, QuerydslBindings bindings) {
175175
*/
176176
private Collection<Object> convertToPropertyPathSpecificType(List<?> source, PathInformation path) {
177177

178-
Class<?> targetType = path.getLeafType();
179-
180178
if (source.isEmpty() || isSingleElementCollectionWithEmptyItem(source)) {
181179
return Collections.emptyList();
182180
}
183181

182+
TypeDescriptor targetType = getTargetTypeDescriptor(path);
184183
Collection<Object> target = new ArrayList<>(source.size());
185184

186185
for (Object value : source) {
187-
target.add(getValue(path, targetType, value));
186+
target.add(getValue(targetType, value));
188187
}
189188

190189
return target;
191190
}
192191

193192
@Nullable
194-
private Object getValue(PathInformation path, Class<?> targetType, Object value) {
193+
private Object getValue(TypeDescriptor targetType, Object value) {
195194

196-
if (ClassUtils.isAssignableValue(targetType, value)) {
195+
if (ClassUtils.isAssignableValue(targetType.getType(), value)) {
197196
return value;
198197
}
199198

200-
if (conversionService.canConvert(value.getClass(), targetType)) {
201-
return conversionService.convert(value, TypeDescriptor.forObject(value), getTargetTypeDescriptor(path));
199+
if (conversionService.canConvert(value.getClass(), targetType.getType())) {
200+
return conversionService.convert(value, TypeDescriptor.forObject(value), targetType);
202201
}
203202

204203
return value;

src/test/java/org/springframework/data/querydsl/binding/QuerydslPredicateBuilderUnitTests.java

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,12 @@
1919
import static org.assertj.core.api.Assumptions.*;
2020
import static org.springframework.test.util.ReflectionTestUtils.*;
2121

22+
import java.util.Arrays;
2223
import java.util.List;
2324

2425
import org.junit.jupiter.api.BeforeEach;
2526
import org.junit.jupiter.api.Test;
27+
2628
import org.springframework.data.querydsl.Address;
2729
import org.springframework.data.querydsl.QSpecialUser;
2830
import org.springframework.data.querydsl.QUser;
@@ -31,7 +33,6 @@
3133
import org.springframework.data.querydsl.User;
3234
import org.springframework.data.querydsl.UserWrapper;
3335
import org.springframework.data.querydsl.Users;
34-
// import org.springframework.data.util.ClassTypeInformation;
3536
import org.springframework.data.util.TypeInformation;
3637
import org.springframework.data.util.Version;
3738
import org.springframework.format.support.DefaultFormattingConversionService;
@@ -181,6 +182,18 @@ void leavesCommaSeparatedArgumentUntouchedWhenTargetIsNotAnArray() {
181182
assertThat(constant.getConstant()).isEqualTo("rivers,two");
182183
}
183184

185+
@Test
186+
void resolvesCommaSeparatedArgumentToListCorrectly() {
187+
188+
values.add("nickNames", "Walt,Heisenberg");
189+
190+
var predicate = builder.getPredicate(USER_TYPE, values, DEFAULT_BINDINGS);
191+
192+
var constant = (Constant<Object>) ((List<?>) getField(getField(predicate, "mixin"), "args")).get(0);
193+
194+
assertThat(constant.getConstant()).isEqualTo(Arrays.asList("Walt", "Heisenberg"));
195+
}
196+
184197
@Test // DATACMNS-883
185198
void automaticallyInsertsAnyStepInCollectionReference() {
186199

0 commit comments

Comments
 (0)