关于字段的Spring Data @Query

时间:2013-08-24 03:10:13

标签: neo4j spring-data spring-data-neo4j

仅当我从数据库中检索实体时,属性上的@Query才会检索值。

@NodeEntity
public class Team
{
    @GraphId
    private Long nodeId;

    @RelatedTo (type = "PREVIOUSLY_KNOWN_AS")
    private Team previouslyKnownAs;

    @Query ("START t=node({self}) MATCH t-[:PREVIOUSLY_KNOWN_AS]-other RETURN other")
        private Iterable<Team> aliases;
}

以下测试仅在我取消注释该行以从db显式读取它时才起作用。为什么有必要?我看到查询在save(t)之后运行,但alias字段为null如果我没有通过取消注释该行从DB读取它

@Test
public void alias()
{
    Team t = new Team();
    t.setName("Alpharetta One");

    Team prev = new Team();
    prev.setName("Previous Name");
    teamRepo.save(prev);

    t.setPreviouslyKnownAs(prev);
    teamRepo.save(t);

    //t = teamRepo.findOne(t.getNodeId());//only works if I uncomment
    assertNotNull(t.getAliases());
}

1 个答案:

答案 0 :(得分:0)

尝试

 t=teamRepo.save(t);

我不认为保存操作会更新您提供给它的POJO,而返回的Object应该是一个托管的enttiy。 关键在于参考文档

  

@Query注释利用Spring Data Neo4j支持的委托基础结构。它提供动态字段,当访问它时,返回由提供的查询语言表达式选择的值。

由于它是一个动态字段,因此该值不是实例化的,而是在每次调用get方法时从DB中取出。为此,必须使用代理对象。但是,如果您没有使用save()返回的实体,SDN无法将您的t对象引用更改为代理对象,这就是为什么它不起作用。