Java H2数据库支持滚动吗
我试图使用滚动来遍历表中的所有记录。 代码和查询非常简单Java H2数据库支持滚动吗,java,hibernate,jdbc,h2,Java,Hibernate,Jdbc,H2,我试图使用滚动来遍历表中的所有记录。 代码和查询非常简单 // a really really simple query String hql = "from " + MyTable.class.getSimpleName(); Query query = session.createQuery(hql); query.setReadOnly(true); query.setFetchSize(Integer.MIN_VALUE); // An exception is caused her
// a really really simple query
String hql = "from " + MyTable.class.getSimpleName();
Query query = session.createQuery(hql);
query.setReadOnly(true);
query.setFetchSize(Integer.MIN_VALUE);
// An exception is caused here
ScrollableResults results = query.scroll(ScrollMode.FORWARD_ONLY);
// My code would have continued by iterating the results
while (results.next()) { ... }
但这会导致出现genericjdbception
:“无法使用scroll执行查询”
是否H2数据库不支持滚动,或者我做错了什么?以下一行是错误的:
query.setFetchSize(Integer.MIN_VALUE);
值Integer.MIN_值
,是告诉JDBC使用流的技巧。但这个技巧(仅)由MySQL支持,而不是由H2支持
发件人:
前向只读结果集与fetch size(获取大小)Integer.MIN_VALUE(最小值)的组合将作为一个信号发送给驱动程序,以逐行流式处理结果集。此后,将逐行检索使用该语句创建的任何结果集
堆栈跟踪显示异常“参数行的无效值-2147483648
”。该值正好是-2^31(Integer.MIN\u值
)。H2不知道如何处理负获取大小,并引发异常
结论:滚动对H2数据库很有效。我不认为这个技巧对任何数据库都有帮助。fetchSize的思想是减少到数据库的往返。你几乎总是想要的。@eckes我引用了MySQL文档中的一句话。@bvdb你说的是“结论:滚动对于H2数据库很好。”但是你能解释一下如何使用H2吗?@BjörnJacobs只需删除
setFetchSize(…)
中的一行即可。剩下的代码应该可以正常工作。
query.setFetchSize(Integer.MIN_VALUE);