From df9fc4680bffd2f17dd567b47c209cb3d70f02dc Mon Sep 17 00:00:00 2001 From: Michael Simons Date: Tue, 1 Sep 2020 15:12:05 +0200 Subject: [PATCH] DATAGRAPH-1184 - Ensure that Query-annotated methods can return Optional values. --- .../domain/queryresult/UserQueryResult.java | 10 ++++- .../examples/movies/repo/UserRepository.java | 7 +++ .../neo4j/queries/QueryIntegrationTests.java | 44 +++++++++++++++++++ 3 files changed, 60 insertions(+), 1 deletion(-) diff --git a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/examples/movies/domain/queryresult/UserQueryResult.java b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/examples/movies/domain/queryresult/UserQueryResult.java index 25bd80c24..f31319029 100644 --- a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/examples/movies/domain/queryresult/UserQueryResult.java +++ b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/examples/movies/domain/queryresult/UserQueryResult.java @@ -23,9 +23,9 @@ import org.springframework.data.neo4j.examples.movies.repo.UserRepository; * Example POJO {@link QueryResult} to test mapping onto arbitrary objects, even for properties that are on the nodes * but not in the entity classes. * - * @see UserRepository * @author Adam George * @author Luanne Misquitta + * @author Michael J. Simons */ @QueryResult public class UserQueryResult { @@ -57,6 +57,14 @@ public class UserQueryResult { this.id = id; } + public String getUserName() { + return userName; + } + + public int getAge() { + return age; + } + @Override public int hashCode() { final int prime = 23; diff --git a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/examples/movies/repo/UserRepository.java b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/examples/movies/repo/UserRepository.java index 6540e683d..812f68eb6 100644 --- a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/examples/movies/repo/UserRepository.java +++ b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/examples/movies/repo/UserRepository.java @@ -18,6 +18,7 @@ package org.springframework.data.neo4j.examples.movies.repo; import java.util.Collection; import java.util.List; import java.util.Map; +import java.util.Optional; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; @@ -157,6 +158,12 @@ public interface UserRepository extends PersonRepository { List findByEmailAddressesNotContaining(String email); + @Query("MATCH (user:User) WHERE user.name=$0 RETURN user") + Optional findOptionalUserWithCustomQuery(String userName); + + @Query("MATCH (user:User) WHERE user.name=$0 RETURN user.name AS userName, 42 as `user.age`") + Optional findOptionalUserResultWithCustomQuery(String userName); + @Query("MATCH (user:User) WHERE user.name=:#{#searchUser.name} RETURN user") User findUserByNameUsingSpElWithObject(@Param("searchUser") User user); diff --git a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/queries/QueryIntegrationTests.java b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/queries/QueryIntegrationTests.java index c4c171977..954fd66fd 100644 --- a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/queries/QueryIntegrationTests.java +++ b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/queries/QueryIntegrationTests.java @@ -28,6 +28,7 @@ import java.util.Collections; import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.Optional; import org.junit.Before; import org.junit.Test; @@ -143,6 +144,49 @@ public class QueryIntegrationTests { }); } + @Test // DATAGRAPH-1184 + public void customQueriesShouldBeAbleToReturnOptionals() { + executeUpdate("CREATE (m:User {name:'Michael'})"); + + transactionTemplate.execute(new TransactionCallbackWithoutResult() { + @Override + public void doInTransactionWithoutResult(TransactionStatus status) { + Optional user = userRepository.findOptionalUserWithCustomQuery("Michael"); + assertThat(user).map(User::getName).hasValue("Michael"); + } + }); + + transactionTemplate.execute(new TransactionCallbackWithoutResult() { + @Override + public void doInTransactionWithoutResult(TransactionStatus status) { + Optional user = userRepository.findOptionalUserWithCustomQuery("Joe User"); + assertThat(user).isNotPresent(); + } + }); + } + + @Test // DATAGRAPH-1184 + public void customQueriesShouldBeAbleToReturnOptionalQueryResults() { + executeUpdate("CREATE (m:User {name:'Michael'})"); + + transactionTemplate.execute(new TransactionCallbackWithoutResult() { + @Override + public void doInTransactionWithoutResult(TransactionStatus status) { + Optional user = userRepository.findOptionalUserResultWithCustomQuery("Michael"); + assertThat(user).map(UserQueryResult::getUserName).hasValue("Michael"); + assertThat(user).map(UserQueryResult::getAge).hasValue(42); + } + }); + + transactionTemplate.execute(new TransactionCallbackWithoutResult() { + @Override + public void doInTransactionWithoutResult(TransactionStatus status) { + Optional user = userRepository.findOptionalUserResultWithCustomQuery("Joe User"); + assertThat(user).isNotPresent(); + } + }); + } + @Test public void shouldFindUserByNameUsingSpElWithIndex() { executeUpdate("CREATE (m:User {name:'Michal'})");