我有三个类,有用户,角色和UserRole。我想获取UserRole的数据,但始终返回NULL。
这是用户类。
@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;
}
}这是我的角色课
@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课
@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答案,并修改了用户类如下:
@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();
}
}保存数据并显示数据后,角色显示如下:
[{"id":27,"username":"daviduck123","password":"admin","firstName":"David","lastName":"Vincent","role":"admin","active":null,"roles":{"id":"29","name":"ROLE_ADMIN"}}]但在此之后,我尝试再次显示所有数据,并将其返回为NULL,如下所示:
[{"id":27,"username":"daviduck123","password":"admin","firstName":"David","lastName":"Vincent","role":"admin","active":null,"roles":null}]这是我的存储库https://github.com/daviduck123/neo4j-ogm-infiniteloop
发布于 2016-01-07 04:05:49
@RelationshipEntity表示两个节点之间的限定关系,因此在其中使用@Relationship是不正确的。
UserRole应该看起来像
@RelationshipEntity(type = "HAS_ROLE")
public class UserRole {
@GraphId
Long id;
@StartNode
User user;
@EndNode
Role role;Role类中关系的方向应该是传入的,因为您正在定义一个从User到Role的HAS_ROLE关系
@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方法也有注释(当您有传入的关系时是强制的)。
发布于 2016-04-15 19:04:11
我想卢安的解决方案会成功的,我们应该使用它。但我还有别的工作要做。您可以在存储库中使用@Query来自定义查询。在查询中,您可以返回所需的所有对象,并将它们写入地图。
@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);然后,您需要手动设置关系。
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。缺点是这不是一个自然的解决方案。
https://stackoverflow.com/questions/34646295
复制相似问题