我有家长班:
@Entity
public Class Parent
{
@OneToMany(fetch=FetchType.LAZY, mappedBy="parent")
public List<Child> children;
}
和儿童班:
@Entity
public Class Child
{
@ManyToOne(fetch=FetchType.Lazy)
@JoinColumn(name="parent")
public Parent parent;
@Column(name="isActive")
public boolean isActive;
}
现在我想使用@Where子句让hibernate只加载所有子项都处于非活动状态的父项。
如何使用@Where或任何其他方法执行此操作?
更新
我想要检索的结果就像这个SQL查询:
SELECT p.*
FROM Parent p LEFT JOIN Child c ON c.parentid = p.id
WHERE c.isActive = 0
答案 0 :(得分:2)
这应该做:
@Entity
public Class Parent
{
@OneToMany(fetch=FetchType.LAZY, mappedBy="parent")
@Where(clause = "isActive = false")
public List<Child> children;
}
<小时/> 新信息后更新的答案:
所以想要这样做的方式是不可能的(至少从我的知识来看)。 我知道的唯一方法是使用自定义查询,如下所示:
String query = "SELECT p FROM Parent p LEFT JOIN p.children Child WHERE children.isActive = 0";
Query newquery = em.createQuery(query, Parent.class);
List<Parent> parents = newquery.getResultList();
em是一个EntityManager。
!!我不确定这对孩子们。如果它不起作用,请尝试使用p.child
答案 1 :(得分:0)
您可以使用以下注释来实现目标:
@OneToMany(fetch=FetchType.LAZY, mappedBy="parent")
@LazyCollection(LazyCollectionOption.TRUE)
public List<Child> children;
OR
@OneToMany(fetch=FetchType.LAZY, mappedBy="parent")
@LazyCollection(LazyCollectionOption.EXTRA)
public List<Child> children;
但是请注意第二个例子,如果你想从childer列表中获取一些元数据,你可能会遇到问题:https://hibernate.atlassian.net/browse/HHH-1491
这个bug仍然存在于hibernate 5.0.1-final中。
但是如果您使用LazyCollectionOption.TRUE
并尝试获得儿童身材,您将获得所有儿童的数据