如何使用 Hibernate 加载实体列表和这些实体的相关实体的子集?

How can I use Hibernate to load a list of entities and a subset of those entities' related entities?

我有一个查询,我想 运行 针对 table,我们称它为 parent,我在其中获取符合特定条件的所有行。在 SQL:

select * from parent where status = 'COMPLETE';

我将这个 table 和另一个相关的 table (child) 定义为 Hibernate 实体,这样:

@Entity
@Table(name = "parent")
public class Parent {
    //...
    @OneToMany(mappedBy = "parent")
    private Set<Child> children;
    //...
}

@Entity
@Table(name = "child")
public class Child {
    //...
    @ManyToOne
    @JoinColumn(name = "parent_id")
    private Parent parent;

    @Column(name = "key")
    private String key;
    //...
}

我希望我的查询还提取两个可选的 child 记录,其中 key 是两个值之一。所以,在 SQL:

select *
from parent p, child ca, child cb
where p.status = 'COMPLETED'
and p.id *= ca.parent_id
and ca.key = 'FIRST_KEY'
and p.id *= cb.parent_id
and cb.key = 'SECOND_KEY';

我可以在 Hibernate 中做到这一点,只需获取第一个查询的结果并遍历 children 集合以查找我想要的行,但这非常低效:一个查询执行两个外部联接与一个查询查询 + 一个额外的查询,用于寻找我关心的 children。

有没有办法在 Hibernate 中复制上面查询中的外连接,其中返回的 objects 将只填充两个(或更少,因为它们是可选的)的 children 集合) 我感兴趣的实体?

您不需要两个外部联接。您可以简单地使用此 HQL,Hibernate 会将正确的子项添加到正确的父项:

List<Parent> parentList = session
        .createQuery("from Parent p left join fetch p.children c" +
                     " where p.status = 'COMPLETE' " + 
                     " and (c.key = 'FIRST_KEY' or c.key = 'SECOND_KEY')")
        .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)
        .list();

for(Parent parent:parentList) {
    System.out.println(parent);;
}

希望能解决您的问题。