我有一个数据库中的大量行需要创建一个XML文档。我正在使用Hibernate 3。Criteria和Query接口中的基本list()方法看起来很危险:我猜如果我只是迭代它们,它几乎必须将所有记录读入内存。或者有一些懒加载的魔法吗?如果没有,我似乎还有两个选择:从Query(scroll也存在于Criteria中)使用scroll()或iterate()。即使我只想迭代它们,iterate看起来也不是很好: "第一个SQL查询仅返回标识符"。那么我是正确的,我必须使用scroll()吗?
我有一个数据库中的大量行需要创建一个XML文档。我正在使用Hibernate 3。Criteria和Query接口中的基本list()方法看起来很危险:我猜如果我只是迭代它们,它几乎必须将所有记录读入内存。或者有一些懒加载的魔法吗?如果没有,我似乎还有两个选择:从Query(scroll也存在于Criteria中)使用scroll()或iterate()。即使我只想迭代它们,iterate看起来也不是很好: "第一个SQL查询仅返回标识符"。那么我是正确的,我必须使用scroll()吗?
尝试将scroll()与此结合使用:
http://docs.jboss.org/hibernate/core/3.3/api/org/hibernate/StatelessSession.html
一个面向命令的API,用于对数据库执行批量操作。
无状态会话不实现一级缓存,也不与任何二级缓存交互,也不实现事务写入后自动检查脏数据,并且操作不会级联到关联实例。无状态会话忽略集合。通过无状态会话执行的操作绕过了Hibernate的事件模型和拦截器。由于没有一级缓存,无状态会话容易受到数据别名效应的影响。
对于某些类型的事务,无状态会话可能比有状态会话稍微快一点。
如果您不需要将对象标记为已处理,则可以简单地使用scroll()并在完成后从会话中清除这些对象。
Criteria crit = sess.createCriteria(Cat.class);
crit.setMaxResults(maxResults);
crit.setFirstResult(firstResultIndex);
List cats = crit.list();
http://hibernate.org/hib_docs/v3/reference/en/html/querycriteria.html
http://www.hibernate.org/hib_docs/v3/api/org/hibernate/Criteria.html
Insert into BatchTable (ID, Seq) Select (O.ID, Sequence.Next)
From MyObject O Where ...
Select Min(B.Seq), Max(B.Seq) From BatchTable;
for (batch = minBatch; batch <= maxBatch; batch += size) {
beginTransaction();
results = query("Select O From MyObject O, BatchTable B
Where O.ID = B.ID and (? <= B.Seq AND B.Seq < ?)");
exportXML(results);
for (MyObject O : results) {
O.setProcessed(True);
O.update();
}
commit();
}