gpt4 book ai didi

java - 使用 Hibernate 迭代结果集而不立即加载所有结果的惯用方法是什么?

转载 作者:行者123 更新时间:2023-11-30 01:20:21 25 4
gpt4 key购买 nike

假设我有一个像这样的查询对象:

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 表不是支持这一点。

最佳答案

您可以使用 SQLQuery 类中的 setMaxResults()setFirstResult() 方法。它们允许您模拟 offsetlimit SQL 子句。

例如,如果您希望加载从 rownum = 0 到 rownum = 50 的结果,您可以使用 setFirstResult(0)setMaxResults(50) 等.

来源:Hibernate Javadocs

关于java - 使用 Hibernate 迭代结果集而不立即加载所有结果的惯用方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18614403/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com