2016-04-25 7 views
0

IteratorまたはFutureをSqlQueryから作成する場合は、SqlRowsをすべてロードするとメモリー不足が発生するためです。
EbeanServer.find()を使用できません。したがって、SqlQueryを使用してください。
クエリはfindIteratefindFutureListですが、SqlQueryにはありません。Ebean:IteratorまたはFutureをSqlQueryから作成する方法

+0

注意:findIterate()の開発者が覚えておく必要がある場所では、リソース(ResultSetなど)が適切に閉じられることを保証するため、query.findEach()およびquery.findEachWhile finallyブロック内のQueryIteratorを閉じます。 –

答えて

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(); 

私は最終的にこのsetListener()アプローチを置き換えることになるのSQLQueryにfindEach()、findEachWhileを()を追加する機能拡張を記録します。

これはhttps://github.com/ebean-orm/avaje-ebeanorm/issues/675

UPDATEとして記録されます。

SqlQuery sqlQuery = Ebean.createSqlQuery("select * from o_order"); 
sqlQuery.findEach(new QueryEachConsumer<SqlRow>() { 
    @Override 
    public void accept(SqlRow row) { 
    // process row 
    } 
}); 

とfindEachWhile()と等価でもあります:バージョンで

はあなたのような何かをするだろう7.9.1。

関連する問題