我想从SqlQuery创建Iterator或Future,因为如果加载所有SqlRows,则会导致内存不足异常。
我不能使用EbeanServer.find()
,所以请使用SqlQuery。
查询具有findIterate
和findFutureList
,但SqlQuery没有。
最佳答案
正确,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()。
关于java - Ebean:如何从SqlQuery创建Iterator或Future,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36837777/