根据JPA 2中的子参数过滤父级

时间:2017-10-30 06:39:29

标签: java hibernate jpa criteria jpql

我有几个单向@OneToMany关系:

@Entity
@Table(name = "Parent")
public class Parent {

    @OneToMany
    @JoinColumn(name = "ParentID")
    private List<Child1> childList1;

    @OneToMany
    @JoinColumn(name = "ParentID")
    private List<Child2> childList2;
}

@Entity
@Table(name = "Child1")
public class Child1 {
    private int someProperty;
    // other properties
}

@Entity
@Table(name = "Child2")
public class Child2 {
    private int someProperty;
    // other properties
}

我试图让所有父母child1.someProperty=10child2.someProperty=20。有人可以帮忙吗? 我尝试使用Join:

Root<Parent> root = criteria.from(Parent.class);
ListJoin<Parent, Child1> join = root.join(Parent_.childList1);
criteriaBuilder.equal(join.get(Child1_.someProperty), 10);

但是,对于每个Parent

,这会返回Child1
Parent----Child1(someProperty=10)
Parent----Child1(someProperty=10)

我希望结果是:

        /Child1(someProperty=10)
       /   
Parent/---Child1(someProperty=10)
      \
       \
        \Child2(someProperty=20)

有人可以帮忙吗?我更喜欢JPA Criteria,但JPQL很好。 我准备对我的实体结构进行微小的改动,如果它有帮助(次要的改变,比如使关系双向化?) 谢谢。
顺便说一句,我使用hibernate作为JPA实现。

1 个答案:

答案 0 :(得分:-1)

您必须在查询中使用setDistinct(true)。 您获得的结果是逐行映射到实体的有效联接结果。添加distinct将启用根聚合,从而导致父母拥有N个孩子,因为我相信你的期望。