Возникли проблемы с загрузкой дочернего элемента Entity через @Query в Sprint Neo4j - PullRequest
0 голосов
/ 06 января 2019

У меня есть такая сущность:

@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!
}

Что мне не хватает? Как сделать так, чтобы запрос загружал дочернее свойство?

1 Ответ

0 голосов
/ 06 января 2019

Когда вы используете пользовательский запрос, вы также должны вернуть отношение и связанные узлы, чтобы заполнить дочерний элемент.

например. @Query("MATCH (n:Move)-[rel:CHILD]-(c:BoardPosition) RETURN n, rel, c") выполнит работу для отношения 1: 1, в противном случае collect(...) потребуется, чтобы получить список в той же «строке» результата, что и узел, к которому вы обращаетесь.

...