代码之家  ›  专栏  ›  技术社区  ›  Aravind Yarram

春季数据@字段查询

  •  1
  • Aravind Yarram  · 技术社区  · 13 年前

    只有当我从数据库中检索实体时,属性上的@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;
    }
    

    只有当我取消对该行的注释以从数据库中显式读取该行时,下面的测试才有效。为什么有必要?我看到查询在 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 回复  |  直到 13 年前
        1
  •  0
  •   PhilBa    13 年前

    尝试

     t=teamRepo.save(t);
    

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

    @Query注释利用了Spring Data Neo4j支持的委派基础设施 动态场 当被访问时,返回由所提供的查询语言表达式所选择的值。

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