我正在阅读一篇关于使用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();
请告诉我。
答案 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链接了解更多详情和解释。