【发布时间】:2016-01-20 18:41:41
【问题描述】:
我有一个查询,我想针对一个表运行,我们称它为parent,我在其中抓取所有符合特定条件的行。在 SQL 中:
select * from parent where status = 'COMPLETE';
我将这个表和另一个相关表 (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;
//...
}
我希望我的查询还提取两个可选子记录,其中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 集合以查找我想要的行,但这非常低效:一个查询执行两个外部连接 vs 一个查询 + 一个附加查询每个寻找我关心的孩子。
有没有办法在 Hibernate 中复制上述查询中的外连接,其中返回的对象将只有 children 集合填充我感兴趣的两个(或更少,因为它们是可选的)实体?
【问题讨论】:
标签: java hibernate outer-join