如果任何一个孩子满足条件,Hibernate会获取父级和所有子级

时间:2016-08-17 20:18:04

标签: hibernate hql hibernate-onetomany

我有2个表:Parent和Child以及Parent和Child之间的oneToMany关系

@Entity
@Table(name="PARENT")
public class Parent {
   int parentID;
   String marritalStatus;
   List<Child> children;

   //getters and setters

   @OneToMany(mappedBy = "parent", cascade=CascadeType.ALL, orphanRemoval=true, fetch = FetchType.EAGER)
   public List<Child> getChildren() {
    return children;
}
}

@Entity
@Table(name="CHILD")
public class Child{
   private Parent parent;           //FK
   private int age; 
   private int childID;

   @ManyToOne
   @JoinColumn(name = "PARENT_ID", referencedColumnName = "PARENT_ID", nullable=false)
    public Parent getParent() {
      return parent;
    }

    public void setParent(Parent parent) {
         this.parent = parent;
    }
}

现在我想要与其中一个孩子年满10岁或以上父母结婚的所有孩子一起取父母。 换一种说法, 让我们说P1有2个孩子,c1年龄= 11,c2 = 8,p1.marritalStatus结婚。
所以我的查询应该用c1和c2来获取P1。

现在它只用c1取P1。没有c2。并且p1.getChildren()仅给出c1。

我的HQL看起来像:

我执行的第一个查询:获取父ID列表

parentIDList =从Parent中选择p.parentID作为p LEFT JOIN将p.children作为c获取,其中c.age&gt; 10和p.marritalStatus =&#39;已婚&#39;&#34;

我得到了正确的父ID列表 在第二个查询中传递父ID(在本例中为P1)列表

父表上的第二个查询(没有连接到子表) &#34;来自Parent作为p,其中p.parentID IN(parentIDList)&#34;

由于FetchType是EAGER,我认为hibernate会在我获取父级时获取所有子级,但看起来并不是这样。

我试过 - 加入Child表进行第二次查询,但它没有给出理想的结果。

我的第一个查询工作正常,我得到了正确的父列表,我的问题是当我运行第二个查询时没有得到所有的孩子。如何解决?

4 个答案:

答案 0 :(得分:0)

尝试这样做以结婚的父母:

select c.parent.parentID from Children c where c.age > 10 and c.parent.marritalStatus = 'married'

说明:

孩子们了解他们的父母,因此您可以访问父母的字段。

答案 1 :(得分:0)

首先,当您在Hibernate中触发任何HQL查询时,它将始终忽略您的实体级别获取模式(fetch = FetchType.EAGER)。为了让您的所有孩子与父母一起,您需要明确加入。所以请写下一个普通的hql查询,它使用join来获取你的子表记录。

答案 2 :(得分:0)

尝试下面给出的查询它对我有用....

/client/main.js

答案 3 :(得分:0)

我必须清除会话。因为fetchtype是EAGER,我不需要第二次加入所有孩子。