mybatis の offset , limit を指定する ResultHandler の実行は、膨大な結果になる
クエリ結果を offset , limit 指定範囲の List を取得するのにこんな方法がある
SqlSession session = ....// SqlSession 生成
// 総称型 T を宣言済みで
final List<T> list = new ArrayList<T>();
session.select(sqlid,param,new RowBounds(offset,limit),new ResultHandler(){
@SuppressWarnings("unchecked")
@Override
public void handleResult(ResultContext con){
list.add((T)con.getResultObject());
}
});
過去、自作した SqlSession インスタンスを隠蔽化、アノテーションで
インターセプト・・・
http://blog.zaq.ne.jp/oboe2uran/article/460/
ここの Dao(IBatisDao)に、ResultHandler実行→ List のメソッドを追加すべきか
悩んだ。結局、継承してそこにメソッドを追加することにした。
import java.util.ArrayList;
import java.util.List;
import org.apache.ibatis.session.ResultContext;
import org.apache.ibatis.session.ResultHandler;
import org.apache.ibatis.session.RowBounds;
/**
* MyBatisDaoPlus IBatisDao を継承したselect拡張追加
*/
public abstract class MyBatisDaoPlus extends IBatisDao{
@QueryLimited
public <T> List<T> selectBounds(String sqlid,int offset,int limit){
final List<T> list = new ArrayList<T>();
getSqlSession().select(sqlid,null,new RowBounds(offset,limit),new ResultHandler(){
@SuppressWarnings("unchecked")
@Override
public void handleResult(ResultContext con){
list.add((T)con.getResultObject());
}
});
return list;
}
@QueryLimited
public <T> List<T> selectBounds(String sqlid,Object param,int offset,int limit){
final List<T> list = new ArrayList<T>();
getSqlSession().select(sqlid,param,new RowBounds(offset,limit),new ResultHandler(){
@SuppressWarnings("unchecked")
@Override
public void handleResult(ResultContext con){
list.add((T)con.getResultObject());
}
});
return list;
}
}