削除
削除を実行するにはDAOメソッドに @Delete
アノテーションを指定します。
@Dao
public interface EmployeeDao {
@Delete
int delete(Employee employee);
}
デフォルトでは、DELETE ステートメントが自動生成されます。 @Delete
アノテーション内の sqlFile
プロパティに true
を指定することで、任意の SQL ファイルをマッピングできます。
パラメータがエンティティクラスであり、エンティティクラスのにエンティティリスナーが指定されている場合、削除を実行する前にエンティティリスナーの preDelete
メソッドが呼び出されます。また、削除実行後にはエンティティリスナーの postDelete
メソッドが呼び出されます。
戻り値
戻り値は、パラメータが不変のエンティティクラスの場合、エンティティクラスを要素とする``org.seasar.doma.jdbc.Result`` である必要があります。
上記の条件が満たされない場合、戻り値は更新された件数を表す int
でなければなりません。
自動生成されたSQLによる削除
パラメータのタイプはエンティティ クラスである必要があります。指定できるパラメータは 1 つだけです。パラメータは null
であってはなりません。
@Delete
int delete(Employee employee);
@Delete
Result<ImmutableEmployee> delete(ImmutableEmployee employee);
自動生成された SQL におけるバージョン番号と楽観的排他制御
以下の条件を満たした場合、楽観的排他制御が実行されます。
パラメータ内のエンティティクラスは @Version アノテーションが付けられたプロパティを持つ
@Delete アノテーション内のignoreVersion要素がfalseである
楽観的排他制御が有効な場合、削除条件にはバージョン番号が識別子に含まれます。削除件数が 0 の場合、楽観的排他制御の失敗を表す OptimisticLockException
がスローされます。
ignoreVersion
@Delete
アノテーション内の ignoreVersion
プロパティが true
の場合、バージョン番号は削除条件に含まれません。この場合、削除件数が 0 であっても OptimisticLockException
はスローされません。
@Delete(ignoreVersion = true)
int delete(Employee employee);
suppressOptimisticLockException
@Delete
アノテーション内の suppressOptimisticLockException
プロパティが true
の場合、削除条件にバージョン番号が含まれます。ただしこの場合、削除件数が 0 であっても OptimisticLockException
はスローされません。
@Delete(suppressOptimisticLockException = true)
int delete(Employee employee);
SQLファイルによる削除
SQLファイルによる削除を実行するには、 @Delete
アノテーション内の sqlFile
プロパティに true
を設定し、対応するSQLファイルを用意します。
パラメータとして任意の型を使用できます。指定できるパラメータの数に制限はありません。パラメータの型が基本型またはドメインクラスの場合、パラメータに null
を設定できます。型がそれ以外の場合、パラメータは null
であってはなりません。
エンティティにエンティティリスナを指定しても、エンティティリスナのメソッドは呼び出されません。
@Delete(sqlFile = true)
int delete(Employee employee);
たとえば、上記のメソッドに対応するSQLは次のように記述します。
delete from employee where name = /* employee.name */'hoge'
SQL ファイルにおけるバージョン番号と楽観的排他制御
以下の条件を満たした場合、楽観的排他制御が実行されます。
エンティティクラスがパラメータに含まれる
パラメータ内の左から最初のEntityクラスが @Version アノテーションが付与されたプロパティを持つ
@Delete アノテーション内のignoreVersion プロパティが false である
@Delete アノテーション内のsuppressOptimisticLockException プロパティが false である
ただし、楽観的排他制御のためのSQLを記述するのはアプリケーション開発者の責任となります。たとえば、以下の SQL のように、WHERE 句にバージョン番号を指定する必要があります。
delete from EMPLOYEE where ID = /* employee.id */1 and VERSION = /* employee.version */1
この SQL 削除数が 0 の場合、楽観的排他制御の失敗を表す OptimisticLockException
がスローされます。削除件数が 0 でない場合は、 OptimisticLockException
はスローされません。
ignoreVersion
@Delete
アノテーション内の ignoreVersion
プロパティが true
の場合、削除件数が何であれ OptimisticLockException
はスローされません。
@Delete(sqlFile = true, ignoreVersion = true)
int delete(Employee employee);
suppressOptimisticLockException
@Delete
アノテーション内の suppressOptimisticLockException
プロパティが true
の場合、削除件数が何であっても OptimisticLockException
はスローされません。
@Delete(sqlFile = true, suppressOptimisticLockException = true)
int delete(Employee employee);
クエリタイムアウト
@Delete
アノテーション内の queryTimeout プロパティにクエリタイムアウトの秒数を指定できます。
@Delete(queryTimeout = 10)
int delete(Employee employee);
この指定はSQLファイルの使用の有無に関わらず適用されます。 queryTimeout
プロパティの値が設定されていない場合は、 設定 で指定されたクエリタイムアウトが使用されます。
SQLログの出力形式
SQLログの出力形式は @Delete
アノテーション内の sqlLog
プロパティに指定できます。
@Delete(sqlLog = SqlLogType.RAW)
int delete(Employee employee);
SqlLogType.RAW
はバインドパラメータ付きの SQL をログ出力することを表します。