diff --git a/src/main/java/org/springframework/data/repository/query/ReturnedType.java b/src/main/java/org/springframework/data/repository/query/ReturnedType.java index 8ff15d351..09dbadb96 100644 --- a/src/main/java/org/springframework/data/repository/query/ReturnedType.java +++ b/src/main/java/org/springframework/data/repository/query/ReturnedType.java @@ -191,7 +191,9 @@ public abstract class ReturnedType { List properties = new ArrayList(); for (PropertyDescriptor descriptor : information.getInputProperties()) { - properties.add(descriptor.getName()); + if (!properties.contains(descriptor.getName())) { + properties.add(descriptor.getName()); + } } return properties; diff --git a/src/test/java/org/springframework/data/repository/query/ReturnedTypeUnitTests.java b/src/test/java/org/springframework/data/repository/query/ReturnedTypeUnitTests.java index f3d3cbaa2..384f24e83 100644 --- a/src/test/java/org/springframework/data/repository/query/ReturnedTypeUnitTests.java +++ b/src/test/java/org/springframework/data/repository/query/ReturnedTypeUnitTests.java @@ -179,6 +179,20 @@ public class ReturnedTypeUnitTests { assertThat(type.isProjecting(), is(false)); } + /** + * @see DATACMNS-963 + */ + @Test + public void detectsDistinctInputProperties() { + + ReturnedType type = ReturnedType.of(Child.class, Object.class, new SpelAwareProxyProjectionFactory()); + + List properties = type.getInputProperties(); + + assertThat(properties, hasSize(1)); + assertThat(properties, contains("firstname")); + } + private static ReturnedType getReturnedType(String methodName, Class... parameters) throws Exception { return getQueryMethod(methodName, parameters).getResultProcessor().getReturnedType(); } @@ -262,4 +276,12 @@ public class ReturnedTypeUnitTests { @Value("#{target.firstname + ' ' + target.lastname}") String getFullName(); } + + static interface Parent { + String getFirstname(); + } + + static interface Child extends Parent { + String getFirstname(); + } }