Spring 域对象的数据 Neo4j/OGM 会话查询
Spring Data Neo4j/OGM session query for domain object
我有以下 Neo4j SDN5/OGM/Cypher 逻辑:
MATCH (v:Value)-[:CONTAINS]->(hv:HistoryValue)
WHERE v.id = {valueId}
OPTIONAL MATCH (hv)-[:CREATED_BY]->(u:User)
WHERE {fetchCreateUsers}
WITH u, hv
ORDER BY hv.createDate DESC
WITH count(hv) as count, COLLECT({u: u, hv: hv}) AS data
RETURN REDUCE(s = [], i IN RANGE(0, count - 1, {step}) | s + data[i]) AS result
我按以下方式执行此查询:
parameters.put("valueId", valueId);
parameters.put("fetchCreateUsers", fetchCreateUsers);
parameters.put("step", step);
StringBuilder cypherQuery = new StringBuilder();
cypherQuery .append(query)); // the query mentioned above
Result queryResult = session.query(cypherQuery.toString(), parameters);
for (Map<String, Object> result : queryResult) {
Map<String, Object>[] maps = (Map<String, Object>[]) result.get("result");
for (Map<String, Object> map : maps) {
System.out.println(map.get("hv").getClass());
System.out.println(map.get("u"));
}
}
我希望收到 map.get("hv")
作为我的领域对象模型 - HistoryValue
但它是 org.neo4j.driver.internal.InternalNode
的 class。
有什么方法可以将 hv
和 u
对象作为我的 SDN 域模型的实例吗?
您正在使用 "raw" 密码调用查询数据库:Result queryResult = session.query(cypherQuery.toString(), parameters);
这将只是 return java-驱动程序生成的形式的数据。
要获得真实对象映射,您必须使用支持用户类型的 OGM 会话方法,例如Session#load(Class, ID)
等,或者在您的 SpringData Neo4j 存储库中创建一个 @Query
注释方法,并在您的包中注释一个额外的 class @QueryResult
以扫描实体。 Details in SpringData Neo4j documentation.
我有以下 Neo4j SDN5/OGM/Cypher 逻辑:
MATCH (v:Value)-[:CONTAINS]->(hv:HistoryValue)
WHERE v.id = {valueId}
OPTIONAL MATCH (hv)-[:CREATED_BY]->(u:User)
WHERE {fetchCreateUsers}
WITH u, hv
ORDER BY hv.createDate DESC
WITH count(hv) as count, COLLECT({u: u, hv: hv}) AS data
RETURN REDUCE(s = [], i IN RANGE(0, count - 1, {step}) | s + data[i]) AS result
我按以下方式执行此查询:
parameters.put("valueId", valueId);
parameters.put("fetchCreateUsers", fetchCreateUsers);
parameters.put("step", step);
StringBuilder cypherQuery = new StringBuilder();
cypherQuery .append(query)); // the query mentioned above
Result queryResult = session.query(cypherQuery.toString(), parameters);
for (Map<String, Object> result : queryResult) {
Map<String, Object>[] maps = (Map<String, Object>[]) result.get("result");
for (Map<String, Object> map : maps) {
System.out.println(map.get("hv").getClass());
System.out.println(map.get("u"));
}
}
我希望收到 map.get("hv")
作为我的领域对象模型 - HistoryValue
但它是 org.neo4j.driver.internal.InternalNode
的 class。
有什么方法可以将 hv
和 u
对象作为我的 SDN 域模型的实例吗?
您正在使用 "raw" 密码调用查询数据库:Result queryResult = session.query(cypherQuery.toString(), parameters);
这将只是 return java-驱动程序生成的形式的数据。
要获得真实对象映射,您必须使用支持用户类型的 OGM 会话方法,例如Session#load(Class, ID)
等,或者在您的 SpringData Neo4j 存储库中创建一个 @Query
注释方法,并在您的包中注释一个额外的 class @QueryResult
以扫描实体。 Details in SpringData Neo4j documentation.