1

次のコードがあるとします。

String sql = "select c.id, c.name from Company c left join Tag t on c.id=t.company_id where c.state='PUBLISHED'";

List<SqlRow> sqlRows =
                Ebean.createSqlQuery(sql).setMaxRows(4000000).findList();
for(SqlRow row : sqlRows) {
    // Do cool stuff
}

findList()この場合、私が本当に望んでいるものではないメモリまですべてをロードします。

私はそれQuery<T>が持っているfindIterate()Ebean.createSqlQuery(sql)戻ってきて、SqlQueryそれが持っていないのを見ましたfindIterate()。では、これを行うにはどうすればよいですか?

4

1 に答える 1

2

ここに RFTM があると思います。または、5 分ほど待ってから問題に戻ります。これが私がやった方法です:

サービスクラス:

String sql = "Select c.id, c.name from Company c left join Tag t on c.id=t.company_id where c.state='PUBLISHED'";    

RawSql rawSql = RawSqlBuilder
            .parse(sql)
            .columnMapping("c.name", "word")
            .columnMappingIgnore("c.id")
            .create();

Query<SearchWord> query = Ebean.find(SearchWord.class);
QueryIterator<SearchWord> iterator = query
            .setMaxRows(4000000)
            .setRawSql(rawSql)
            .findIterate();
try {
    while (iterator.hasNext()) {
        iterator.next()
        // do magic stuff in here
    }
} finally {
    iterator.close();
}

検索ワード

@Entity
public class SearchWord {

    private String word;
    private String type;

    public SearchWord() {
    }

    public String getWord() {
        return word;
    }

    public void setWord(String word) {
        this.word = word;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }
}
于 2012-12-13T14:10:43.547 に答える