SQLファイルを使ったバッチ更新で意図しないSQLが実行され得る場合に対応
https://www.seasar.org/issues/browse/CONTAINER-427 はS2JDBCの問題ですが、Domaでも同様のことが起き得ます。アイデアもらったのでDomaなりのaptを活用した対応をしてみました。
バッチ更新では、複数のSQLがバッチで発行されますが、その際のそれぞれのSQLはバインド変数の値を除いて同じSQLでなければいけません。Domaには動的にSQLを変更する機能(埋め込み変数コメント、条件コメント、繰り返しコメント)がありますが、これらをバッチ更新で使用するとエラーになったり意図しないSQLが発行されたりします。
Domaでは、そのような状況への対策として、バッチ更新で使用するSQLファイルに埋め込み変数コメント、条件コメント、繰り返しコメントのいずれかが含まれていた場合、コンパイル時に検出して警告を表示することにしました。
たとえば次のようなSQLがあるとします。set句に条件コメントを含んでいます。
update DEPARTMENT set DEPARTMENT_NAME = /*entity.departmentName*/'aaa', /*%if entity.location != null */ LOCATION = /*entity.location*/'aaa', /*%end */ VERSION = /*entity.version*/0 + 1 where DEPARTMENT_ID = /*entity.departmentId*/1 and VERSION = /*entity.version*/0
このSQLにマッピングさせるDaoのバッチ更新用のメソッドでは次のように警告が表示されます。
警告が出た場合は、埋め込み変数コメント、条件コメント、繰り返しコメント等が本当に必要かどうか見直してもらって、どうしても必要でさらに安全ということが確認できれば、@Suppressというアノテーションで警告を抑制できます。
次のバージョンで正式に対応予定です。とりあえずSNAPSHOTつくりました。よければお試しください。