如何使用 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);;
}
希望能解决您的问题。
我有一个查询,我想 运行 针对 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);;
}
希望能解决您的问题。