Skip to content

Commit 2100234

Browse files
GH-2261 - Improve checks whether a query method belongs to CypherDSL statement executor.
This changes uses Spring's ClassUtils to test whether a specific method belongs to `CypherdslStatementExecutor` or `ReactiveCypherdslStatementExecutor` as criteria if it needs to be executed as a `CypherdslBasedQuery` or not. Before this only the declaring class was checked which is not enough, as this will prevent all derived query methods from working in a repository that extends `CypherdslStatementExecutor`. This fixes #2261.
1 parent 166bd1d commit 2100234

File tree

3 files changed

+26
-1
lines changed

3 files changed

+26
-1
lines changed

src/main/java/org/springframework/data/neo4j/repository/query/Neo4jQueryMethod.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import org.springframework.data.repository.query.Parameters;
3030
import org.springframework.data.repository.query.QueryMethod;
3131
import org.springframework.lang.Nullable;
32+
import org.springframework.util.ClassUtils;
3233

3334
/**
3435
* Neo4j specific implementation of {@link QueryMethod}. It contains a custom implementation of {@link Parameter} which
@@ -64,7 +65,8 @@ class Neo4jQueryMethod extends QueryMethod {
6465

6566
Class<?> declaringClass = method.getDeclaringClass();
6667
this.repositoryName = declaringClass.getName();
67-
this.cypherBasedProjection = CypherdslStatementExecutor.class.isAssignableFrom(declaringClass) || ReactiveCypherdslStatementExecutor.class.isAssignableFrom(declaringClass);
68+
this.cypherBasedProjection = ClassUtils.hasMethod(CypherdslStatementExecutor.class, method) || ClassUtils
69+
.hasMethod(ReactiveCypherdslStatementExecutor.class, method);
6870
this.queryAnnotation = AnnotatedElementUtils.findMergedAnnotation(method, Query.class);
6971
}
7072

src/test/java/org/springframework/data/neo4j/integration/imperative/CypherdslConditionExecutorIT.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,13 +203,24 @@ void existsShouldWork(@Autowired PersonRepository repository) {
203203
assertThat(repository.exists(firstName.eq(Cypher.literalOf("A")))).isTrue();
204204
}
205205

206+
@Test // GH-2261
207+
void standardDerivedFinderMethodsShouldWork(@Autowired ARepositoryWithDerivedFinderMethods repository) {
208+
209+
assertThat(repository.findByFirstName("Helge")).isNotNull();
210+
}
211+
206212
// tag::sdn-mixins.dynamic-conditions.add-mixin[]
207213
interface PersonRepository extends
208214
Neo4jRepository<Person, Long>, // <.>
209215
CypherdslConditionExecutor<Person> { // <.>
210216
}
211217
// end::sdn-mixins.dynamic-conditions.add-mixin[]
212218

219+
interface ARepositoryWithDerivedFinderMethods extends Neo4jRepository<Person, Long>, CypherdslConditionExecutor<Person> {
220+
221+
Person findByFirstName(String firstName);
222+
}
223+
213224
@Configuration
214225
@EnableTransactionManagement
215226
@EnableNeo4jRepositories(considerNestedRepositories = true)

src/test/java/org/springframework/data/neo4j/integration/imperative/CypherdslStatementExecutorIT.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,13 +221,25 @@ void findPageProjectedShouldWork(@Autowired PersonRepository repository) {
221221
.containsExactly("Bela B.", "Helge Schneider");
222222
}
223223

224+
@Test // GH-2261
225+
void standardDerivedFinderMethodsShouldWork(@Autowired ARepositoryWithDerivedFinderMethods repository) {
226+
227+
assertThat(repository.findByFirstName("Helge")).isNotNull();
228+
}
229+
224230
// tag::sdn-mixins.using-cypher-dsl-statements.add-mixin[]
225231
interface PersonRepository extends
226232
Neo4jRepository<Person, Long>,
227233
CypherdslStatementExecutor<Person> {
228234
}
229235
// end::sdn-mixins.using-cypher-dsl-statements.add-mixin[]
230236

237+
interface ARepositoryWithDerivedFinderMethods extends Neo4jRepository<Person, Long>,
238+
CypherdslStatementExecutor<Person> {
239+
240+
Person findByFirstName(String firstName);
241+
}
242+
231243
@Configuration
232244
@EnableTransactionManagement
233245
@EnableNeo4jRepositories(considerNestedRepositories = true)

0 commit comments

Comments
 (0)