1

我的域有一个 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”?如果我删除“不同”,我会得到一个乘法。对于父级的每个子级,将整个父级复制到结果集中。

有一个更好的方法吗?只是感觉……有点蹩脚。

4

1 回答 1

0

在 JPA 中,您需要在加入 OneToMany 时设置 distinct,否则它将返回重复项。这是必需的。

JPA 规范要求这样做,但这是一个奇怪的默认设置,但与数据库连接中发生的情况有关。

于 2012-09-17T14:30:27.307 回答