概要
本記事は、Doma1 から Doma2 へ移行した際の調査メモである。
Doma2 で IterationCallback を用いた検索が禁止された。java.util.stream.Stream
を用いた検索に書き換えるよう公式ドキュメントで指示があり、最低限の変更で対応する方法を調査したので、具体例を示す。
本記事が対象とするのは、検索結果に対して単純なループ処理を行うものである。IterationContext に対して何か操作をしているようなコードではない。
書き換え前: Doma1 でのコード
Doma1 でのコードは https://doma.seasar.org/reference/query/select.html より引用。
DAO インターフェース
@Select(iterate = true)
Void selectByNameAndSalary(String name, BigDecimal salary, IterationCallback<Void, Employee> callback);
検索実行部分
EmployeeDao dao = new EmployeeDao();
dao.selectByNameAndSalary(name, salary, new IterationCallback<Void, Employee>() {
@Override
public Void iterate(Employee target, IterationContext context) {
...
return null;
}
});
書き換え後: Doma2 でのコード
java.util.stream.Stream
を用いた検索に書き換える。
DAO インターフェース
-
@Select
アノテーションの引数にstrategy = SelectType.STREAM
を指定 -
IterationCallback<R, T>
型の引数をFunction<T, R>
型に変更- 型引数の順番が逆になるので注意
@Select(strategy = SelectType.STREAM)
Void selectByNameAndSalary(String name, BigDecimal salary, Function<Stream<Employee>, Void> callback);
検索実行部分
- IterationCallback を Function に変更
- 型引数の順番が逆になるので注意
- iterate メソッドの変更
- メソッド名を
apply
に変更 - 引数でエンティティ型のストリームを受け取る
- メソッドの引数にあった IterationContext を除去
- メソッド名を
- メソッド内でストリームの
forEachOrdered
メソッドを呼び出す-
forEachOrdered
の処理に、元のメソッドの処理を移す (return
文以外)
-
EmployeeDao dao = new EmployeeDao();
dao.selectByNameAndSalary(name, salary, new Function<Stream<Employee>, Void>() {
@Override
public Void apply(Stream<Employee> stream) {
stream.forEachOrdered((target) -> {
// ここに Doma1 での iterate メソッドの中身を移す
// ただし return 文は除去する
...
});
return null;
}
});