3

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

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

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

请告诉我。

4

2 回答 2

2

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

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

请点击链接了解更多详细信息和说明。

于 2014-12-09T05:57:52.057 回答
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 的值。

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

注意 forScrollableResults sc = session.createCriteria(Employee.class).scroll();应该被迭代为

 while(sc.next()) {
     Employee emp = (Employee)sc.get(0);
     System.out.println(emp.getname);
 }
于 2014-12-08T23:37:00.500 回答