diff --git a/pom.xml b/pom.xml index 1b887099..b0a1daf2 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ org.springframework.data spring-data-keyvalue - 2.6.0-SNAPSHOT + 2.6.0-GH-385-SNAPSHOT Spring Data KeyValue diff --git a/src/main/java/org/springframework/data/keyvalue/repository/query/KeyValuePartTreeQuery.java b/src/main/java/org/springframework/data/keyvalue/repository/query/KeyValuePartTreeQuery.java index 78eac68c..97f07073 100644 --- a/src/main/java/org/springframework/data/keyvalue/repository/query/KeyValuePartTreeQuery.java +++ b/src/main/java/org/springframework/data/keyvalue/repository/query/KeyValuePartTreeQuery.java @@ -139,6 +139,8 @@ protected Object doExecute(Object[] parameters, KeyValueQuery query) { Iterable result = this.keyValueOperations.find(query, queryMethod.getEntityInformation().getJavaType()); return result.iterator().hasNext() ? result.iterator().next() : null; + } else if (new PartTree(queryMethod.getName(), queryMethod.getEntityInformation().getJavaType()).isExistsProjection()) { + return keyValueOperations.count(query, queryMethod.getEntityInformation().getJavaType()) > 0; } throw new UnsupportedOperationException("Query method not supported."); diff --git a/src/test/java/org/springframework/data/keyvalue/repository/query/KeyValuePartTreeQueryUnitTests.java b/src/test/java/org/springframework/data/keyvalue/repository/query/KeyValuePartTreeQueryUnitTests.java index 3987aea2..6b35c3f2 100644 --- a/src/test/java/org/springframework/data/keyvalue/repository/query/KeyValuePartTreeQueryUnitTests.java +++ b/src/test/java/org/springframework/data/keyvalue/repository/query/KeyValuePartTreeQueryUnitTests.java @@ -137,10 +137,32 @@ void shouldApplyDerivedMaxResultsToQueryWithParameters() throws SecurityExceptio assertThat(query.getRows()).isEqualTo(3); } + @Test // GH-385 + void shouldUseCountForExists() throws NoSuchMethodException { + + when(metadataMock.getDomainType()).thenReturn((Class) Person.class); + when(metadataMock.getReturnType(any(Method.class))) + .thenReturn((TypeInformation) ClassTypeInformation.from(Boolean.class)); + when(metadataMock.getReturnedDomainClass(any(Method.class))).thenReturn((Class) Boolean.class); + + QueryMethod qm = new QueryMethod(Repo.class.getMethod("existsByFirstname", String.class), metadataMock, + projectionFactoryMock); + + KeyValuePartTreeQuery partTreeQuery = new KeyValuePartTreeQuery(qm, QueryMethodEvaluationContextProvider.DEFAULT, + kvOpsMock, SpelQueryCreator.class); + + KeyValueQuery query = partTreeQuery.prepareQuery(new Object[] { "firstname" }); + partTreeQuery.doExecute(new Object[] { "firstname" }, query); + + verify(kvOpsMock).count(eq(query), eq(Person.class)); + } + interface Repo { List findByFirstname(String firstname); + boolean existsByFirstname(String firstname); + List findBy(Pageable page); List findTop3By();