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

时间:2014-12-08 18:32:28

标签: java hibernate scrollableresults

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

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

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

请告诉我。

2 个答案:

答案 0 :(得分:1)

我引用了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);
 }

答案 1 :(得分:0)

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

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();

关注this链接了解更多详情和解释。