Hibernate @Where子句基于One To many relative

时间:2015-12-03 14:04:37

标签: java hibernate

我有家长班:

@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

2 个答案:

答案 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并尝试获得儿童身材,您将获得所有儿童的数据