Skip to content

Commit 8c32f0a

Browse files
christophstroblmp911de
authored andcommitted
Add support for executing derived existsBy queries.
Closes: #385 Original pull request: #386.
1 parent 8f1c0ec commit 8c32f0a

File tree

2 files changed

+24
-0
lines changed

2 files changed

+24
-0
lines changed

src/main/java/org/springframework/data/keyvalue/repository/query/KeyValuePartTreeQuery.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,8 @@ protected Object doExecute(Object[] parameters, KeyValueQuery<?> query) {
139139

140140
Iterable<?> result = this.keyValueOperations.find(query, queryMethod.getEntityInformation().getJavaType());
141141
return result.iterator().hasNext() ? result.iterator().next() : null;
142+
} else if (new PartTree(queryMethod.getName(), queryMethod.getEntityInformation().getJavaType()).isExistsProjection()) {
143+
return keyValueOperations.count(query, queryMethod.getEntityInformation().getJavaType()) > 0;
142144
}
143145

144146
throw new UnsupportedOperationException("Query method not supported.");

src/test/java/org/springframework/data/keyvalue/repository/query/KeyValuePartTreeQueryUnitTests.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,10 +137,32 @@ void shouldApplyDerivedMaxResultsToQueryWithParameters() throws SecurityExceptio
137137
assertThat(query.getRows()).isEqualTo(3);
138138
}
139139

140+
@Test // GH-385
141+
void shouldUseCountForExists() throws NoSuchMethodException {
142+
143+
when(metadataMock.getDomainType()).thenReturn((Class) Person.class);
144+
when(metadataMock.getReturnType(any(Method.class)))
145+
.thenReturn((TypeInformation) ClassTypeInformation.from(Boolean.class));
146+
when(metadataMock.getReturnedDomainClass(any(Method.class))).thenReturn((Class) Boolean.class);
147+
148+
QueryMethod qm = new QueryMethod(Repo.class.getMethod("existsByFirstname", String.class), metadataMock,
149+
projectionFactoryMock);
150+
151+
KeyValuePartTreeQuery partTreeQuery = new KeyValuePartTreeQuery(qm, QueryMethodEvaluationContextProvider.DEFAULT,
152+
kvOpsMock, SpelQueryCreator.class);
153+
154+
KeyValueQuery<?> query = partTreeQuery.prepareQuery(new Object[] { "firstname" });
155+
partTreeQuery.doExecute(new Object[] { "firstname" }, query);
156+
157+
verify(kvOpsMock).count(eq(query), eq(Person.class));
158+
}
159+
140160
interface Repo {
141161

142162
List<Person> findByFirstname(String firstname);
143163

164+
boolean existsByFirstname(String firstname);
165+
144166
List<Person> findBy(Pageable page);
145167

146168
List<Person> findTop3By();

0 commit comments

Comments
 (0)