0
0

Doma1からDoma2への移行: IterationCallbackの書き換え

Posted at

概要

本記事は、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;
  }
});
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0