SDN 4 - Neo4jOperation.convert() 已弃用

SDN 4 - Neo4jOperation.convert() deprecated

使用 SDN 3 可以使用 Neo4jOperations.convert(对象值,Class 类型) 将 returns Iterable> 的密码查询结果转换为 Neo4j 域 class(用 @NodeEntity 注释)。例如:

Map<String,Object> results = repository.findSomething("John");
for(Map<String,Object> row : results) {
    Person person = neo4jOperations.convert(row.get("person"), Person.class);
    ...
}

// Repository method
@Query("MATCH (person:Person)-[rel]->(node) WHERE person.firstName = {firstName}  RETURN DISTINCT person, COUNT(rel) ORDER BY COUNT(rel)"
Iterable<Map<String,Object>> findSomething(@Param("firstName") String firstName);

由于 T convert(Object value, Class type) 不再存在于 SDN 4 的 Neo4jOperations 中,在 SDN 4 中它的等价物是什么?

http://docs.spring.io/spring-data/neo4j/docs/4.0.0.M1/reference/html/#reference_programming_model_simple-mapping 不包括 mapping/conversion 是如何显式或隐式完成的。

我正在使用快照构建。

非常感谢任何帮助。

对于此用例,您必须 return ID(person) 并改用 repository.findOneneo4jOperations.load

正如 Luanne 所建议的,您目前需要分两步完成此操作。对于存储库方法,您可以尝试这样的方法:

@Query("MATCH (p:Person)-[rel]->(node) WHERE p.firstName = {firstName} RETURN DISTINCT p ORDER BY COUNT(rel)")
Iterable<Person> findSomething(@Param("firstName") String firstName);

这应该 return 您想要的 Person 实体以正确的顺序排列,但我很欣赏实际计数不会被映射,因此您必须发出第二个查询才能找到算了,不幸的是。

如果您不需要实际的 Person 实体,而只是这些节点的一些属性,那么解决方法可能是映射到 @QueryResult 对象。像这样:

@Query("MATCH (p:Person)-[rel]->(node) WHERE p.firstName = {firstName} RETURN DISTINCT p.firstName, p.surname, p.dateOfBirth, COUNT(rel) AS rank ORDER BY rank")
Iterable<PersonQueryResult> findSomething(@Param("firstName") String firstName);

...其中 PersonQueryResult 是用 @QueryResult 注释的 POJO,其中 setters/getters 对应于查询的 return 子句中列出的属性。