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 回答