使用可滚动结果集在hibernate中批量读取数据

我正在阅读一篇关于使用hibernate http://java.dzone.com/articles/bulk-fetching-hibernate进行批量提取的博客。
在此, ScrollableResults用作解决方案。 在这里,我们仍然需要从会话中逐出对象。
我不明白使用ScrollableResults (或scroll() )与使用list()有何不同。

换句话说,以下陈述在绩效方面有何不同

  List empList = session.createCriteria(Employee.class).list(); ScrollableResults sc = session.createCriteria(Employee.class).scroll(); 

请告诉我。

我引用了Hibernate API文档来理解list()和scroll()之间的区别。 ScrollableResults就像一个游标。 ScrollableResults的一个重要特性是它允许访问当前结果行中的第i个对象,而不通过get(int i)函数初始化行中的任何其他结果。 它还允许使用next()和previous()函数来回移动结果集。

示例:

  ScrollableResults sc = session.createQuery("select e.employeeName,e.employeeDept FROM Employee e").scroll(ScrollMode.SCROLL_INSENSITIVE); while(sc.next()) { String empName = (String)sc.get(0); System.out.println(empName); String empdept = (String)sc.get(1); System.out.println(empdept); } 

上述程序的输出将是employeeName和employeeDept的值。

现在假设您想获取resultSet的最后一条记录。 使用list(),您需要迭代整个结果。 使用ScrollableResults,您可以使用last()函数。

请注意,对于ScrollableResults sc = session.createCriteria(Employee.class).scroll(); 应该迭代为

  while(sc.next()) { Employee emp = (Employee)sc.get(0); System.out.println(emp.getname); } 

上面的代码似乎缺少一些设置。

 Query query = session.createQuery(query); query.setReadOnly(true); // MIN_VALUE gives hint to JDBC driver to stream results query.setFetchSize(Integer.MIN_VALUE); ScrollableResults results = query.scroll(ScrollMode.FORWARD_ONLY); // iterate over results while (results.next()) { Object row = results.get(); // process row then release reference // you may need to flush() as well } results.close(); 

请点击此链接了解更多详情和解释。