Ebean:如何从SqlQuery创建Iterator或Future

时间:2016-04-25 10:19:31

标签: java ebean

我想从SqlQuery创建Iterator或Future,因为如果加载所有SqlRows,导致内存不足异常。
我不能使用EbeanServer.find(),所以使用SqlQuery 查询有findIteratefindFutureList,但SqlQuery没有。

1 个答案:

答案 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()等效。