我想从SqlQuery创建Iterator或Future,因为如果加载所有SqlRows,则会导致内存不足异常。
我不能使用EbeanServer.find(),所以请使用SqlQuery。
查询具有findIteratefindFutureList,但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/

10-08 22:15