エンティティのイテレーション

エンティティを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のラッパーみたいなのです。