GH-2791 - Support map with entity (list) as query parameter.

Closes #2791
This commit is contained in:
Gerrit Meier
2023-09-15 14:18:55 +02:00
parent e5c0324d12
commit ccbd5eb5d9
4 changed files with 31 additions and 1 deletions

View File

@@ -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);
}

View File

@@ -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;
@@ -533,6 +534,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,

View File

@@ -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<Person, String> {
// 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<Person, String> {
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<String, List<Knows>> relationshipList);
}

View File

@@ -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)));
}
}