首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Spring数据Neo4j 4- @Fetch对findAll的更改(int深度)总是返回null

Spring数据Neo4j 4- @Fetch对findAll的更改(int深度)总是返回null
EN

Stack Overflow用户
提问于 2016-01-07 02:12:44
回答 2查看 1.2K关注 0票数 2

我有三个类,有用户,角色和UserRole。我想获取UserRole的数据,但始终返回NULL。

这是用户类。

代码语言:javascript
复制
@NodeEntity
public class User {
    @GraphId
    Long id;

    @NotNull
    private String username;

    @NotNull
    private String password;

    @NotNull
    private String firstName;

    @NotNull
    private String lastName;

    @NotNull
    private String role;

    @NotNull
    private Boolean active;

    @Relationship(type = "HAS_ROLE", direction = Relationship.OUTGOING)
    private Set<UserRole> userRoles;

    public User() {
        super();
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getRole() {
        return role;
    }

    public void setRole(String role) {
        this.role = role;
    }

    public Boolean getActive() {
        return active;
    }

    public void setActive(Boolean active) {
        this.active = active;
    }

    public Iterable<UserRole> getUserRoles() {
        return userRoles;
    }

    public void setUserRoles(Set<UserRole> userRoles) {
        this.userRoles = userRoles;
    }
}

这是我的角色课

代码语言:javascript
复制
@NodeEntity
public class Role {
    @GraphId
    Long id;

    @NotNull
    String name;

    @Relationship(type = "HAS_ROLE",direction = Relationship.OUTGOING)
    @JsonIgnore
    private Set<UserRole> userRoles;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }


    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Set<UserRole> getUserRoles() {
        return userRoles;
    }

    public void setUserRoles(Set<UserRole> userRoles) {
        this.userRoles = userRoles;
    }

    public Role() {
        super();
    }
}

这是我的UserRole课

代码语言:javascript
复制
@RelationshipEntity(type = "HAS_ROLE")
public class UserRole {
    @GraphId
    Long id;

    @StartNode
    @Relationship(type="HAS_ROLE", direction=Relationship.INCOMING)
    User user;

    @EndNode
    @Relationship(type="HAS_ROLE", direction=Relationship.INCOMING)
    Role role;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    public Role getRole() {
        return role;
    }

    public void setRole(Role role) {
        this.role = role;
    }

    public UserRole(User user, Role role) {
        super();
        this.user = user;
        this.role = role;
    }

    public UserRole() {
        super();
    }
}

我想显示所有的用户数据,但是结果总是显示userRoles NULL。我使用的是findAll(1)和findAll(2),但没有什么不同。

它不同于SDN 3,我们只添加@Fetch到字段。在SDN 4中,没有@Fetch注释。我怎么能获取所有的数据?

更新!!

我更改了类,如Luanne答案,并修改了用户类如下:

代码语言:javascript
复制
@NodeEntity
public class User {
    @GraphId
    Long id;

    @NotNull
    private String username;

    @NotNull
    private String password;

    @NotNull
    private String firstName;

    @NotNull
    private String lastName;

    @NotNull
    private String role;

    @NotNull
    private Boolean active;

    @Relationship(type = "HAS_ROLE")
    private Set<UserRole> userRoles;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getRole() {
        return role;
    }

    public void setRole(String role) {
        this.role = role;
    }

    public Boolean getActive() {
        return active;
    }

    public void setActive(Boolean active) {
        this.active = active;
    }

    @Relationship(type = "HAS_ROLE")
    public Set<UserRole> getUserRoles() {
        return userRoles;
    }

    @Relationship(type = "HAS_ROLE")
    public void setUserRoles(Set<UserRole> userRoles) {
        this.userRoles = userRoles;
    }

    public User(){
        super();
    }
}

保存数据并显示数据后,角色显示如下:

代码语言:javascript
复制
[{"id":27,"username":"daviduck123","password":"admin","firstName":"David","lastName":"Vincent","role":"admin","active":null,"roles":{"id":"29","name":"ROLE_ADMIN"}}]

但在此之后,我尝试再次显示所有数据,并将其返回为NULL,如下所示:

代码语言:javascript
复制
[{"id":27,"username":"daviduck123","password":"admin","firstName":"David","lastName":"Vincent","role":"admin","active":null,"roles":null}]

这是我的存储库https://github.com/daviduck123/neo4j-ogm-infiniteloop

EN

回答 2

Stack Overflow用户

发布于 2016-01-07 04:05:49

@RelationshipEntity表示两个节点之间的限定关系,因此在其中使用@Relationship是不正确的。

UserRole应该看起来像

代码语言:javascript
复制
@RelationshipEntity(type = "HAS_ROLE")
public class UserRole {
    @GraphId
    Long id;

    @StartNode
    User user;

    @EndNode
    Role role;

Role类中关系的方向应该是传入的,因为您正在定义一个从UserRoleHAS_ROLE关系

代码语言:javascript
复制
    @Relationship(type = "HAS_ROLE",direction = Relationship.INCOMING)
    @JsonIgnore
    private Set<UserRole> userRoles;

   @Relationship(type = "HAS_ROLE",direction = Relationship.INCOMING)    
   public Set<UserRole> getUserRoles() {
        return userRoles;
    }

   @Relationship(type = "HAS_ROLE",direction = Relationship.INCOMING)   
   public void setUserRoles(Set<UserRole> userRoles) {
        this.userRoles = userRoles;
    }

确保访问器和mutator方法也有注释(当您有传入的关系时是强制的)。

票数 2
EN

Stack Overflow用户

发布于 2016-04-15 19:04:11

我想卢安的解决方案会成功的,我们应该使用它。但我还有别的工作要做。您可以在存储库中使用@Query来自定义查询。在查询中,您可以返回所需的所有对象,并将它们写入地图。

代码语言:javascript
复制
@Query("match (ac: Address) <-[:at]- (c: Company) <-[:of]- (p: Position) -[:at]-> (a: Address) "
        + "where p.name =~ {0} return p as position, c as company, a as address, ac as companyAddress skip {1} limit {2}")
List<Map<String, Object>> fetchByTitle(String title, int start, int pageSize);

然后,您需要手动设置关系。

代码语言:javascript
复制
List<Position> positions = new ArrayList<Position>();
    for (Map<String, Object> d : data) {
        Position pos = (Position) d.get("position");
        pos.setCompany((Company) d.get("company"));
        pos.setLocation((Address) d.get("address"));
        pos.getCompany().setAddress((Address) d.get("companyAddress"));
        positions.add(pos);
    }

    return positions;

好处是您不需要使用@RelationshipEntity,作为一个SQL用户,我仍然不习惯使用@RelationshipEntity。缺点是这不是一个自然的解决方案。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34646295

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档