削除

削除を実行するには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 をログ出力することを表します。