我想从SqlQuery创建Iterator或Future,因为如果加载所有SqlRows,导致内存不足异常。
我不能使用EbeanServer.find()
,所以使用SqlQuery
查询有findIterate
和findFutureList
,但SqlQuery没有。
答案 0 :(得分:1)
正确,SqlQuery没有findIterate()或findEach()......但它确实有类似的机制。
您改为使用setListener。
SqlQuery sqlQuery = Ebean.createSqlQuery("select * from o_order");
sqlQuery.setListener(new SqlQueryListener() {
@Override
public void process(SqlRow bean) {
// process 1 row at a time to avoid OOM with large queries
System.out.println("process row "+bean);
}
});
// returns an empty list
sqlQuery.findList();
我将记录一个增强功能,将findEach(),findEachWhile()添加到SqlQuery,最终将替换此setListener()方法。
这记录为https://github.com/ebean-orm/avaje-ebeanorm/issues/675
<强>更新强>
在版本7.9.1中,您可以执行以下操作:
SqlQuery sqlQuery = Ebean.createSqlQuery("select * from o_order");
sqlQuery.findEach(new QueryEachConsumer<SqlRow>() {
@Override
public void accept(SqlRow row) {
// process row
}
});
还有findEachWhile()等效。