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();