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

时间:2009-11-12 08:08:51

标签: java mysql database hibernate orm

我执行一个返回实体列表的查询。如何从ScrollableResults

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

如何在最后一行代码中找到一名员工

4 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:2)

以下是API的链接:ScrollableResults

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

答案 2 :(得分:0)

为了改进其他答案,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];
   ...
}

答案 3 :(得分:0)

要检索实体,最简单的方法是将对象强制转换为您想要的对象: E.g:

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

这适用于所有场景。