通过HQL的Hibernate ScrollableResults需要为每个关联提供左连接提取

时间:2012-11-15 20:07:34

标签: hibernate hql scrollableresults

希望一些Hibernate大师可以提供帮助。

我有一个如下所示的对象结构:

class Customer {
    private Stuff1 stuff1;
    private Stuff2 stuff2;

    // Bazillion other fields
}

class Report {
    private Customer customer;
    private String uniqueBatchId; 

    // Bazillion other fields 
}

class AbstractSpecialReport {
    private Report report;

    //Bunch of other fields
}

class SpecialReport extends AbstractSpecialReport{
    private List<ReportParts> reportParts;           
}

这三个都被注释为Hibernate实体,并且所有关联都是默认的(使用Hibernate 3.2,所以默认情况下应该是懒惰的。

我想使用此HQL来使用ScrollableResults获取结果。我已经完成了所需的咒语以使结果集流式传输。

select srpt
from SpecialReport as srpt
left join fetch srpt.report as rpt
left join fetch rpt.customer as cst
left join fetch cst.stuff1
left join fetch cst.stuff2
where rpt.uniqueBatchId = :batchId

但我得到“java.sql.SQLException:流式结果集com.mysql.jdbc.RowDataDynamic@633f8d4f仍处于活动状态。当任何流式结果集打开并在给定连接上使用时,不会发出任何语句。确保在尝试更多查询之前,您已在任何活动的流式结果集上调用.close()。“

我有sql查询登录,我可以清楚地看到它试图在向前滚动后在Report 上获取一个不相关的属性。

所以我开始增加我的HQL以包含这些字段。

现在看起来像

select srpt
from SpecialReport as srpt
left join fetch srpt.report as rpt
left join fetch rpt.customer as cst
left join fetch rpt.field1
left join fetch rpt.field2
left join fetch rpt.field3
left join fetch rpt.field4 as child
-- now field 4 was an object that also has fields that are associations.
left join fetch child.field1
left join fetch child.field2
-- ad nauseum, this keeps going down the object tree 
left join fetch cst.stuff1
left join fetch cst.stuff2
where rpt.uniqueBatchId = :batchId

即使有大约25个连接,我仍然有更多的字段被加载导致相同的异常。 我可以继续手动浏览图表,但这是永远的,我觉得这不应该是必要的。通过Hibernate代码看来,滚动调用的TwoPhaseLoad尝试初始化对象中的所有代理和延迟加载字段,这必然会破坏滚动运行时不执行其他sql查询的要求。这对那里的任何人都有意义吗?

1 个答案:

答案 0 :(得分:1)

XxxToOne关联默认是急切的。如果你不希望Hibernate急切地加载它们,请将它们注释为惰性。

此外,SpecialReport是一个Report,因此以下连接没有多大意义:

from SpecialReport as srpt
left join fetch srpt.report as rpt