Hibernate:如何从 ScrollableResults 中检索我的实体?

Posted

技术标签:

【中文标题】Hibernate:如何从 ScrollableResults 中检索我的实体?【英文标题】:Hibernate: how do I retrieve my entities from a ScrollableResults? 【发布时间】:2010-12-15 19:03:55 【问题描述】:

我做了一个返回实体列表的查询。如何从ScrollableResults 检索实体:

 Session s  = ....;
 Query q = s.createQuery("....") # returns 100000s rows
 ScrollableResults sr = q.scroll();
 sr.scroll(45999); # just a number
 Employee employee = ???

如何在最后一行代码中获取员工

【问题讨论】:

【参考方案1】:

我做了一个返回实体列表的查询。如何从 ScrollableResults 中检索实体...如何获取员工。

只是为了改进其他答案,ScrollableResults 会为您进行实体转换,尽管 Javadocs 并没有立即明确这一点。

正如@Bozho 所说,调用sr.get() 将返回当前位置的实体,但包装在一个数组中。在查看ScrollableResultsImpl 的代码时,当前行的结果设置为:

    if ( result != null && result.getClass().isArray() ) 
        currentRow = (Object[]) result;
     else 
        currentRow = new Object[]  result ;
    

所以ScrollableResults.get() 总是返回一个结果数组,如果您的实体不是一个数组,它将位于get()[0]

因此,您可以使用您的代码执行以下操作:

while (sr.next()) 
   // get the entity which is the first element in an Object[]
   Employee employee = sr.get()[0];
   ...

【讨论】:

【参考方案2】:

要检索实体,最简单的方法是将对象转换为您想要的任何对象: 例如:

ScrollableResults sr = q.scroll();
while (sr.next()) 
    CustomObject object = (CustomObject) sr.get()[0]; // Now CustomObject will have all the properties mapped

这适用于所有场景。

【讨论】:

【参考方案3】:

这里是 API 的链接:ScrollableResults

get() 返回整个当前行,get(index)index 位置返回对象而不初始化其余对象。还有一堆方便的 getXXX() 方法可以将结果转换为给定的类型。

【讨论】:

如果你提供一个例子,这篇文章会更有用。例如,如果您获得客户,“整个当前行”会是什么样子?如果客户有两个字段,名称和 ID,我希望 get[0] 是名称,get[1] 是 ID。但事实并非如此,据我所知,get[0] 是客户。【参考方案4】:

尝试get(0) 方法,或get()[0]

【讨论】:

以上是关于Hibernate:如何从 ScrollableResults 中检索我的实体?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 entitymanager 访问 Hibernate 统计信息?

如何从不同位置加载 hibernate.cfg.xml

Hibernate:如何从具有多个类的查询中获取结果

如何使用 Hibernate 从 Observable 列表中删除多个项目

如何将 Hibernate 从 MySQL 迁移到 SQL Server?

Hibernate - 删除子项时如何从父项中删除实体