Browse Source

DATACMNS-1300 - Improved collection query detection for Iterables.

Previously a custom Iterable implementation would've caused QueryMethod.isCollectionQuery() to return true. We now solely rely on TypeInformation.isCollectionLike() (which checks for exact Iterable, Collection assignability and arrays) after handling potential wrapper types.
pull/301/head
Oliver Gierke 8 years ago
parent
commit
f3c138258b
No known key found for this signature in database
GPG Key ID: 6E42B5787543F690
  1. 15
      src/main/java/org/springframework/data/repository/query/QueryMethod.java
  2. 20
      src/test/java/org/springframework/data/repository/query/QueryMethodUnitTests.java

15
src/main/java/org/springframework/data/repository/query/QueryMethod.java

@ -154,7 +154,8 @@ public class QueryMethod { @@ -154,7 +154,8 @@ public class QueryMethod {
Class<?> methodDomainClass = metadata.getReturnedDomainClass(method);
this.domainClass = repositoryDomainClass == null || repositoryDomainClass.isAssignableFrom(methodDomainClass)
? methodDomainClass : repositoryDomainClass;
? methodDomainClass
: repositoryDomainClass;
}
return domainClass;
@ -186,13 +187,11 @@ public class QueryMethod { @@ -186,13 +187,11 @@ public class QueryMethod {
return true;
}
if (QueryExecutionConverters.supports(unwrappedReturnType)
&& QueryExecutionConverters.isSingleValue(unwrappedReturnType)) {
return false;
if (QueryExecutionConverters.supports(unwrappedReturnType)) {
return !QueryExecutionConverters.isSingleValue(unwrappedReturnType);
}
return org.springframework.util.ClassUtils.isAssignable(Iterable.class, unwrappedReturnType)
|| unwrappedReturnType.isArray();
return ClassTypeInformation.from(unwrappedReturnType).isCollectionLike();
}
/**
@ -285,7 +284,9 @@ public class QueryMethod { @@ -285,7 +284,9 @@ public class QueryMethod {
Assert.notEmpty(types, "Types must not be null or empty!");
TypeInformation<?> returnType = ClassTypeInformation.fromReturnTypeOf(method);
returnType = QueryExecutionConverters.isSingleValue(returnType.getType()) ? returnType.getComponentType()
returnType = QueryExecutionConverters.isSingleValue(returnType.getType()) //
? returnType.getComponentType() //
: returnType;
for (Class<?> type : types) {

20
src/test/java/org/springframework/data/repository/query/QueryMethodUnitTests.java

@ -38,6 +38,7 @@ import org.springframework.data.projection.ProjectionFactory; @@ -38,6 +38,7 @@ import org.springframework.data.projection.ProjectionFactory;
import org.springframework.data.projection.SpelAwareProxyProjectionFactory;
import org.springframework.data.repository.Repository;
import org.springframework.data.repository.core.RepositoryMetadata;
import org.springframework.data.repository.core.support.AbstractRepositoryMetadata;
import org.springframework.data.repository.core.support.DefaultRepositoryMetadata;
import org.springframework.data.util.Version;
@ -221,6 +222,15 @@ public class QueryMethodUnitTests { @@ -221,6 +222,15 @@ public class QueryMethodUnitTests {
assertThat(new QueryMethod(method, repositoryMetadata, factory).isCollectionQuery(), is(true));
}
@Test // DATACMNS-1300
public void doesNotConsiderMethodForIterableAggregateACollectionQuery() throws Exception {
RepositoryMetadata metadata = AbstractRepositoryMetadata.getMetadata(ContainerRepository.class);
Method method = ContainerRepository.class.getMethod("someMethod");
assertThat(new QueryMethod(method, metadata, factory).isCollectionQuery(), is(false));
}
interface SampleRepository extends Repository<User, Serializable> {
String pagingMethodWithInvalidReturnType(Pageable pageable);
@ -274,4 +284,14 @@ public class QueryMethodUnitTests { @@ -274,4 +284,14 @@ public class QueryMethodUnitTests {
class SpecialUser extends User {
}
// DATACMNS-1300
class Element {}
abstract class Container implements Iterable<Element> {}
interface ContainerRepository extends Repository<Container, Long> {
Container someMethod();
}
}

Loading…
Cancel
Save