エンティティのイテレーション
エンティティを1件ずつイテレートする機能を実装しました。IterationCallbackはS2JDBCを参考に同じインタフェースにしました。
Daoの定義はこんなん。@Selectのiteration要素をtrueにします。
@Dao(config = MyConfig.class) public interface EmployeeDao extends GenericDao<Employee> { @Select(iteration = true) <R> R selectByDeptNo(IterationCallback<R, Employee> callback, IntegerDomain deptNo); ... }
IterationCallbackの1番目の型パラメータがDaoのメソッドの戻り値になります。この例ではジェネリクスを使って呼び出し側で決まる型 R を返すようにしています。
使い方はこんなかんじ。部署ごとに給料をサマリするといった例です。
Salary total = dao.selectByDeptNo( new IterationCallback<Salary, Employee>() { Salary total = new Salary(BigDecimal.ZERO); @Override public Salary iterate(Employee target, IterationContext context) { Salary salary = target.salary(); total = total.add(salary); return total; } }, deptNo);
ここでのSalaryはEMPLOYEEテーブルのSALARYカラムに対応するアプリケーション固有のクラス。BigDecimalのラッパーみたいなのです。