我已使用包含多个实体的标准API编写了休眠代码(具有父子关系,并且我正在使用createAlias()来连接实体),期望在结果中仅获取根实体。
但是,当我调试由hibernate生成的SQL时,我发现hibernate正在为join子句(通过createAlias()实现)中使用的所有实体获取数据(在select子句中)。
我认为除了预期的根实体以外,没有必要获取其他实体的列,因为它可能效率不高,我想避免这种情况?
我正在使用Hibernate 3.6.9版本
这是场景。有3个具有父子关系的实体A,B和C,其方式为A(超级父级)-> B(父级)-> C(子级)
session.createCriteria(B.class, "b")
.createAlias("b.c", "c",Criteria.INNER_JOIN)
.createAlias("b.a", "a",Criteria.INNER_JOIN)
.add(Restrictions.in("c.prop1c", <<some value>>))
.add(Restrictions.in("a.prop1a", <<some value>>))
criteria.list()
now when hibernate generates the SQL it looks like
select
b.all columns of B
a.all columns of A
c.all columns of C
from B b
inner join A a on b.prop=a.prop
inner join C C on b.prop=c.prop
where
c.prop1c = <<some value>>
a.prop1a = <<some value>>
如果您观察到休眠状态已生成查询以获取所有实体(A,B和C)的所有列,但是截至目前,我不需要除根实体(B)以外的任何实体,应获取诸如A&C之类的实体的数据后来按照它们到B的映射上的提取策略进行操作。我认为无需为此查询通过n / w流量获取所有数据,但休眠仍会像这样生成查询。
有没有一种方法可以引导冬眠只使用条件API来获取实体B的列,而不能获取A&C的列?
select
b.all columns of B
from B b
inner join A a on b.prop=a.prop
inner join C C on b.prop=c.prop
where
c.prop1c = <<some value>>
a.prop1a = <<some value>>
遗留条件已弃用。您可以通过JOIN指令(而不是FETCH)使用支持此功能的JPA标准。
或者,使用JPQL:
select b
from B b
inner join b.a. a
inner join b.a. c
where
c.prop1c = :prop1c
a.prop1a = :prop1a
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句