SQLファイルを使ったバッチ更新で意図しないSQLが実行され得る場合に対応

https://www.seasar.org/issues/browse/CONTAINER-427S2JDBCの問題ですが、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つくりました。よければお試しください。