【发布时间】:2013-09-07 23:51:03
【问题描述】:
假设我有一个这样的查询对象:
final SQLQuery query = createQuery(); // org.hibernate.SQLQuery
// HibernateTransaction is just a wrapper around Hibernate's Transaction, Session and
// SessionFactory classes
// the corresponding method:
private SQLQuery createQuery(HibernateTransaction t) {
final SQLQuery query = t.fullSQLQuery(MY_QUERY_STRING);
query.addScalar("column1", Hibernate.LONG);
query.addScalar("column2", Hibernate.LONG);
query.setResultTransformer(new AliasToBeanResultTransformer(MyDTO.class));
return query;
}
SQLQuery 对象有一个名为iterate() 的方法。我的问题是,如果我尝试做这样的事情:
Iterator<MyDTO> iterator = query.iterate();
while(iterator.hasNext()) {
MyDTO dto = iterator.next();
// ...
}
我收到不支持迭代的异常。如果我使用query.list() 方法,那么我会得到一个List<MyDTO>,这很好,但如果我的查询返回一百万行,它会变慢并最终耗尽内存。
我的问题是,使用 Hibernate 一次只获取一行并懒惰地迭代它们的惯用方式是什么?在我的示例中,我尝试逐行处理表格中的数据。
我正在考虑使用聚集索引,并且只查询一次 1000 行,接下来的 1000 行将基于前 1000 行的最后一个 id(所以基本上我在考虑分页),但我们使用的 MyISAM 表不是支持这个。
【问题讨论】:
标签: java mysql sql hibernate pagination