概要
SQLはすべてバインド変数(?)を使った準備された文に変換されて実行されますが、 このドキュメントでは、発行されたSQLがどのようなものかわかりやすくするためにバインド変数を実際の値に置き換えたログ用のSQLを示します。
SQLの自動生成による更新
src/test/java/tutorial/UpdateTest.javaのtestUpdateメソッドを参照してください。 SQLの自動生成による更新です。
使用するDaoのメソッド定義は次のとおりです。
@Update int update(Employee employee);
Daoのメソッドは次のように呼び出します。
Employee employee = dao.selectById(1); employee.setName("hoge"); employee.setJobType(JobType.PRESIDENT); dao.update(employee);
SQLのログは次のように出力されます(改行しています)。
update Employee set JOB_TYPE = 'PRESIDENT', name = 'hoge', updateTimestamp = '2009-11-21 17:06:37.593', VERSION = 1 + 1 where id = 1 and VERSION = 1
@Versionが注釈されたversionプロパティに対応するカラムは検索条件に含まれます。 また、versionプロパティに対応するカラムが増分して更新されます。
updateTimestampプロパティはEmployeeListenerで自動設定されます。 src/test/java/tutorial/EmployeeListener.javaを参照してください。
エンティティクラスに@OriginalStatesが注釈されたプロパティがある場合、 バージョン番号を除き、 Daoから取得後に変更された値のみがUPDATE文のSET句に含まれます。
SQLファイルによる更新
src/test/java/tutorial/UpdateTest.javaのtestUpdateWithSqlFileメソッドを参照してください。 SQLファイルによる更新です。
使用するDaoのメソッド定義は次のとおりです。 @UpdateのsqlFile要素にtrueを指定します。
@Update(sqlFile = true) int updateWithSqlFile(Employee employee);
Daoのメソッドに対応するSQLファイルのパスはMETA-INF/tutorial/dao/EmployeeDao/updateWithSqlFile.sqlです。 SQLファイルには次のように記述されています。
update Employee set NAME = /* employee.name */'test', AGE = /* employee.age */10, DEPARTMENT_ID = /* employee.departmentId */1, HIREDATE = /* employee.hiredate */date'2010-01-01', JOB_TYPE = /* employee.jobType */'SALESMAN', SALARY = /* employee.salary */300, UPDATETIMESTAMP = /* employee.updateTimestamp */timestamp'2010-01-01 12:34:56', VERSION = /* employee.version */1 where ID = /* employee.id */1
Daoのメソッドは次のように呼び出します。
Employee employee = dao.selectById(1); employee.setName("hoge"); employee.setJobType(JobType.PRESIDENT); dao.updateWithSqlFile(employee);
SQLのログは次のように出力されます。
update Employee set NAME = 'hoge', AGE = 30, DEPARTMENT_ID = 1, HIREDATE = '2008-01-20', JOB_TYPE = 'PRESIDENT', SALARY = 1600, UPDATETIMESTAMP = null, VERSION = 1 where ID = 1
SQLファイルによる更新では、バージョンの自動増分は行われません。 また、エンティティリスナーも呼び出されません。
SQLファイルによる更新では、エンティティクラスに@OriginalStatesが注釈されたプロパティがあってもそのプロパティは使用されません。