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 78eac68..97f0707 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 @@ public class KeyValuePartTreeQuery implements RepositoryQuery { 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 3987aea..6b35c3f 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 @@ class KeyValuePartTreeQueryUnitTests { 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();