当我尝试检索具有相同标签(相同类型)的两个节点以及两个白色弹簧数据之间的相关性时,我遇到了问题。
我做了一个查询,得到最后一个,就像那样:
@Query("MATCH (b1:Block)-[rel]->(b2) " +
"WHERE NOT (b1)<-[]-() " +
"RETURN *; ")
Block findLast();
Block属性为:
@GraphId
private Long id;
private String hash;
@Relationship(direction = Relationship.OUTGOING)
private Block predecessor;
问题是ogm说有两个结果(我用b1和b2),并抛出这个例外:
Caused by: java.lang.RuntimeException: Result not of expected size. Expected 1 row but found 2
at org.neo4j.ogm.session.delegates.ExecuteQueriesDelegate.queryForObject(ExecuteQueriesDelegate.java:73) ~[neo4j-ogm-core-2.1.5.jar:na]
at org.neo4j.ogm.session.Neo4jSession.queryForObject(Neo4jSession.java:382) ~[neo4j-ogm-core-2.1.5.jar:na]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_121]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_121]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_121]
at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_121]
据我所知,OGM无法选择@Query方法中返回的节点,因为找到两个相同类型的节点,但是如何将第二个节点填入第一个节点?
感谢!!!!
答案 0 :(得分:0)
在这种情况下,您使用自定义查询对OGM行为的解释是正确的。 OGM没有机会区分两个Block
实体。
我认为你在这里唯一的选择是引入一个@QueryResult
类并返回它的实例而不是Block
对象。
@QueryResult
public class BlockResult {
private Block predecessor;
/* other fields and/or relationships */
}
此类需要存在于实体扫描的包中。 然后,您可以将带注释的查询方法更改为:
@Query("MATCH (b1:Block)-[rel]->(b2) " +
"WHERE NOT (b1)<-[]-() " +
"RETURN b1, rel, b2 as predecessor; ")
Block findLast();
这里重要的一点是as predecessor
部分,因为SDN需要知道&#39;列&#39;在结果中命名以在QueryResult
对象中匹配它。