JPA选择新的构造函数会导致其他选择

时间:2012-02-26 22:00:50

标签: hibernate jpa constructor left-join jpql

我有一个复杂的JPA / Hibernate问题。 我有两个实体A和B.一个参考B,但不需要这种关系。

public class A {

@JoinColumn(name = "b_id", referencedColumnName = "b_id")
@OneToOne
private B b;

}

我写SELECT NEW dto(a.b) FROM A a这会产生内连接,这对我不利,因为a.b可以为null,我想要所有的A entites。所以我像这样重写我的查询:SELECT NEW dto(b) FROM A a LEFT JOIN B b我们必须使用别名(b)来阻止内连接并只获得外连接。好的,我得到所有的线,但我得到额外的查询,Hibernate为所有B实体生成SELECT查询。为什么,我怎么能阻止这个,我使用左连接,因为我只想要一个查询。

修改

内部联接的同样问题。如果使用SELECT NEW dto(a.b) FROM A a其他SELECT b FROM B b WHERE b.id = ?,则如果我致电SELECT NEW dto(a.b.id) FROM A a,则无法选择其他{{1}}。

EDIT2:

这与我的问题完全相同:Same problem, without possible solution.

因为我没有加载父对象本身,所以Hibernate不会急切加载B ...

2 个答案:

答案 0 :(得分:1)

你想要从A引用的B,因为你使用的是hql:

SELECT NEW dto(b) FROM A a LEFT JOIN a.b b

答案 1 :(得分:0)

现在我知道导致问题的原因了,我也知道解决方案。

部分 解决方案是使用hibernate的setResultTransformer方法。不幸的是,JPA不支持它......