From 9a09c2bde61c6afbb9e915b45ea55cb80b5b81f3 Mon Sep 17 00:00:00 2001 From: Gerrit Meier Date: Fri, 15 Sep 2023 14:18:55 +0200 Subject: [PATCH] GH-2791 - Support map with entity (list) as query parameter. Closes #2791 --- .../neo4j/repository/query/Neo4jQuerySupport.java | 5 +++++ .../data/neo4j/integration/issues/IssuesIT.java | 11 +++++++++++ .../integration/issues/gh2323/PersonRepository.java | 11 ++++++++++- .../integration/issues/gh2323/PersonService.java | 5 +++++ 4 files changed, 31 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/springframework/data/neo4j/repository/query/Neo4jQuerySupport.java b/src/main/java/org/springframework/data/neo4j/repository/query/Neo4jQuerySupport.java index f1edf93c6..8978db48d 100644 --- a/src/main/java/org/springframework/data/neo4j/repository/query/Neo4jQuerySupport.java +++ b/src/main/java/org/springframework/data/neo4j/repository/query/Neo4jQuerySupport.java @@ -209,6 +209,11 @@ abstract class Neo4jQuerySupport { return result; } + if (parameter instanceof Map mapValue) { + return mapValue.entrySet().stream() + .collect(Collectors.toMap(Map.Entry::getKey, v -> convertParameter(v.getValue(), conversionOverride))); + } + return mappingContext.getConversionService().writeValue(parameter, TypeInformation.of(parameter.getClass()), conversionOverride); } diff --git a/src/test/java/org/springframework/data/neo4j/integration/issues/IssuesIT.java b/src/test/java/org/springframework/data/neo4j/integration/issues/IssuesIT.java index acf11b869..722f9dd71 100644 --- a/src/test/java/org/springframework/data/neo4j/integration/issues/IssuesIT.java +++ b/src/test/java/org/springframework/data/neo4j/integration/issues/IssuesIT.java @@ -80,6 +80,7 @@ import org.springframework.data.neo4j.integration.issues.gh2289.Sku; import org.springframework.data.neo4j.integration.issues.gh2289.SkuRO; import org.springframework.data.neo4j.integration.issues.gh2289.SkuRORepository; import org.springframework.data.neo4j.integration.issues.gh2289.SkuRepository; +import org.springframework.data.neo4j.integration.issues.gh2323.Knows; import org.springframework.data.neo4j.integration.issues.gh2323.Language; import org.springframework.data.neo4j.integration.issues.gh2323.Person; import org.springframework.data.neo4j.integration.issues.gh2323.PersonService; @@ -531,6 +532,16 @@ class IssuesIT extends TestBase { }); } + @Test + @Tag("GH-2791") + void ensureMapOfRelationshipGetsSerialized(@Autowired PersonService personService) { + Knows knowsRelationship = new Knows("somedescription", new Language("German")); + + Person person = personService.queryWithMapOfRelationship("someKey", knowsRelationship); + + assertThat(person.getName()).isEqualTo("Helge"); + } + @Test @Tag("GH-2326") void saveShouldAddAllLabels(@Autowired AnimalRepository animalRepository, diff --git a/src/test/java/org/springframework/data/neo4j/integration/issues/gh2323/PersonRepository.java b/src/test/java/org/springframework/data/neo4j/integration/issues/gh2323/PersonRepository.java index df07e158a..aa5e8cd7a 100644 --- a/src/test/java/org/springframework/data/neo4j/integration/issues/gh2323/PersonRepository.java +++ b/src/test/java/org/springframework/data/neo4j/integration/issues/gh2323/PersonRepository.java @@ -16,6 +16,7 @@ package org.springframework.data.neo4j.integration.issues.gh2323; import java.util.List; +import java.util.Map; import org.springframework.data.neo4j.repository.Neo4jRepository; import org.springframework.data.neo4j.repository.query.Query; @@ -28,7 +29,7 @@ import org.springframework.stereotype.Repository; @Repository public interface PersonRepository extends Neo4jRepository { - // Using separate id and than relationships on top level + // Using separate id and then relationships on top level @Query(""" UNWIND $relations As rel WITH rel MATCH (f:Person {id: $from}) @@ -60,4 +61,12 @@ public interface PersonRepository extends Neo4jRepository { RETURN f, frl, mt, collect(r), collect(t) """) Person updateRelWith11(@Param("person") Person person); + + @Query(""" + UNWIND keys($relationships) as relationshipKey + UNWIND $relationships[relationshipKey] as relationship + MATCH (p:Person)-[:HAS_MOTHER_TONGUE]->(:Language{name: relationship.__target__.__id__}) + RETURN p + """) + Person queryWithMapOfRelationship(@Param("relationships") Map> relationshipList); } diff --git a/src/test/java/org/springframework/data/neo4j/integration/issues/gh2323/PersonService.java b/src/test/java/org/springframework/data/neo4j/integration/issues/gh2323/PersonService.java index c560212d3..3f5ca9a46 100644 --- a/src/test/java/org/springframework/data/neo4j/integration/issues/gh2323/PersonService.java +++ b/src/test/java/org/springframework/data/neo4j/integration/issues/gh2323/PersonService.java @@ -16,6 +16,7 @@ package org.springframework.data.neo4j.integration.issues.gh2323; import java.util.List; +import java.util.Map; import java.util.Optional; import java.util.stream.Collectors; @@ -66,4 +67,8 @@ public class PersonService { return original; } + + public Person queryWithMapOfRelationship(String key, Knows knows) { + return personRepository.queryWithMapOfRelationship(Map.of(key, List.of(knows))); + } }