【发布时间】:2015-06-24 20:00:03
【问题描述】:
我有一个巨大的实体,我想加载它的子集(ID 和 baz 属性):
@Entity
public class GiganticEntity {
@Id Long id;
@OneToOne(mappedBy = "giganticEntity")
Foo foo;
@OneToOne(mappedBy = "giganticEntity")
Bar bar;
@OneToOne(mappedBy = "giganticEntity")
Baz baz;
// default constructor + getters/setters
public GiganticEntity(Long id, Baz baz) {
this.id = id;
this.baz = baz;
}
}
我尝试使用以下 JPA 查询,但 baz 属性将为空:
"SELECT new package.GiganticEntity(ge.id, ge.baz) " +
"FROM GiganticEntity ge WHERE ge.id = 1";
我尝试添加显式连接,但结果也为 null:
"SELECT new package.GiganticEntity(ge.id, b) FROM GiganticEntity ge " +
"LEFT JOIN ge.baz as b " +
"WHERE ge.id = 1";
如果我只选择这样的巨大实体,那么一切正常(但我正在尝试保存一些连接):
"SELECT GiganticEntity g WHERE g.id = 1";
这可以通过 JPA 实现吗?我使用 Hibernate 作为它的实现。
编辑:查询实际上需要是LEFT JOIN,所以我需要所有巨大的实体和baz-es。
【问题讨论】:
-
你试过
LEFT JOIN FETCH还是FETCH ALL PROPERTIES?? -
你考虑过让
foo和bar变得懒惰吗? -
您对建议的解决方案有更多期望吗?恐怕如果你不能让
OneToOne变得懒惰,你将不得不删除它们。否则,即使在查询中显式实例化,baz仍将加载GiganticEntity... -
不,我想我会选择弗拉德的答案。
标签: java hibernate jpa orm hibernate-mapping