我的域有一个 Category 实体,它本身具有双向关系。每个类别都可以有一个父级和一个子级。
@Entity
public class Category implements DomainObject {
private Long id;
private Integer version;
private String name;
private Category parent;
private Set<Category> children;
@Override
@Id
@GeneratedValue
public final Long getId() {
return id;
}
@Version
public Integer getVersion() {
return version;
}
public void setVersion(Integer version) {
this.version = version;
}
public void setId(Long id) {
this.id = id;
}
@Column(unique=true, nullable=false)
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@ManyToOne
public Category getParent() {
return parent;
}
public void setParent(Category parent) {
this.parent = parent;
}
@OneToMany
@JoinColumn(name = "parent_id")
public Set<Category> getChildren() {
return children;
}
public void setChildren(Set<Category> children) {
this.children = children;
}
}
我创建了以下查询来获取具有直接(1 级)子级的“根”类别。
select distinct c from Category c left join fetch c.children where c.parent is null order by c.name
这实际上有效。我的问题是:为什么我需要 getChildren() 上的“JoinColumn”注释来完成这项工作,为什么我不能只进行“foin fetch”查询,而不需要“distinct”?如果我删除“不同”,我会得到一个乘法。对于父级的每个子级,将整个父级复制到结果集中。
有一个更好的方法吗?只是感觉……有点蹩脚。