AsakusaFW & Tsurugi Advent Calendar 2021の5日目です。
2019年のAsakusa Frameworkアドベントカレンダーの5日目で、SQLのUPDATE文を実現するのはUpdate演算子で出来ると書きました。
大抵のケースではそれで問題ないのですが、実はそれでは無理なケースがあります。
update テーブル set c1 = c2, c2 = c1;
のように、値を入れ替えるようなパターンです。
これをUpdate演算子で何も考えずに移植すると、以下のようになって、正しい結果が得られません。
@Update
public void update(テーブル in) {
in.setC1Option(in.getC2Option());
in.setC2Option(in.getC1Option()); // 更新された値を使ってしまう!
}
Update演算子でやるなら、一時変数に値を保存しておいて…みたいなコーディングをする必要があります。
この場合、Convert演算子を使えば素直に書けます。
@Convert
public テーブル update(テーブル in) {
テーブル result = ~;
result.copyFrom(in);
result.setC1Option(in.getC2Option());
result.setC2Option(in.getC1Option());
return result;
}