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/287/head
Oliver Gierke 8 years ago
parent
commit
3676ae0c87
No known key found for this signature in database
GPG Key ID: 6E42B5787543F690
  1. 12
      src/main/java/org/springframework/data/repository/query/QueryMethod.java
  2. 20
      src/test/java/org/springframework/data/repository/query/QueryMethodUnitTests.java

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

@ -181,13 +181,11 @@ public class QueryMethod { @@ -181,13 +181,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();
}
/**
@ -289,7 +287,9 @@ public class QueryMethod { @@ -289,7 +287,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.getRequiredComponentType()
returnType = QueryExecutionConverters.isSingleValue(returnType.getType()) //
? returnType.getRequiredComponentType() //
: 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;
@ -230,6 +231,15 @@ public class QueryMethodUnitTests { @@ -230,6 +231,15 @@ public class QueryMethodUnitTests {
assertThat(new QueryMethod(method, repositoryMetadata, factory).isCollectionQuery()).isTrue();
}
@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()).isFalse();
}
interface SampleRepository extends Repository<User, Serializable> {
String pagingMethodWithInvalidReturnType(Pageable pageable);
@ -283,4 +293,14 @@ public class QueryMethodUnitTests { @@ -283,4 +293,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