我有一个这样的实体:
@NodeEntity
public class Move {
@Id @GeneratedValue private Long id;
@Property("placement")
private String placement;
@Relationship(type="PARENT", direction=Relationship.INCOMING)
BoardPosition parent;
@Relationship("CHILD")
BoardPosition child;
[...]
当我像这样“加载”它时:
Move the_move = m_store.findByPlacement("C1");
log.info("Move direct load: " + the_move.toString());
它工作正常。 parent
和child
属性都具有正确的值。
但是,当我通过这样定义的查询访问它时:
public interface MoveStore extends Neo4jRepository<Move, Long> {
public Move findByPlacement(String placement);
@Query("MATCH (n:Move) RETURN n")
public List<Move> findAll();
并按以下方式访问:
ListIterator<Move> moves = m_store.findAll().listIterator();
while(moves.hasNext() ) {
log.info(moves.next().toString());
}
它缺少child
值(为空)。
这个实验很奇怪:
while(moves.hasNext() ) {
Move m = moves.next();
log.info(m.toString()); // This is missing m.child's value
// find the same Move, by passing in the id of this one:
m = m_store.findById(m.id).orElse(null);
log.info(m.toString()); // This has the correct value for m.child!
}
我想念什么?如何使查询加载子属性?
答案 0 :(得分:1)
使用自定义查询时,还必须返回关系和相关节点以填充子代。
例如@Query("MATCH (n:Move)-[rel:CHILD]-(c:BoardPosition) RETURN n, rel, c")
可以按照1:1的关系进行工作,否则需要collect(...)
才能使列表与您要查询的节点在相同的结果“行”中。