我有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表进行第二次查询,但它没有给出理想的结果。
我的第一个查询工作正常,我得到了正确的父列表,我的问题是当我运行第二个查询时没有得到所有的孩子。如何解决?
答案 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,我不需要第二次加入所有孩子。