削除

DAO メソッドに @Delete を付けて、削除操作を実行します。

@Dao
public interface EmployeeDao {
    @Delete
    int delete(Employee employee);
}

デフォルトでは、DELETE ステートメントが自動生成されます。@Delete アノテーション内の sqlFile プロパティに true を設定することで、任意の SQL ファイルをマッピングできます。

エンティティクラスパラメータにエンティティリスナーが指定されている場合、削除操作を実行する前にその preDelete メソッドが呼び出されます。同様に、削除操作が完了した後で postDelete メソッドが呼び出されます。

戻り値

returning プロパティを使用する場合

returning

returning プロパティを使用しない場合

パラメータがimmutableなエンティティクラスの場合、戻り値はそのエンティティクラスを要素とする 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 の場合、バージョン番号は削除条件に含まれません。この場合、削除された行がなくても OptimisticLockException はスローされません。

@Delete(ignoreVersion = true)
int delete(Employee employee);

suppressOptimisticLockException

@Delete アノテーション内の suppressOptimisticLockException プロパティが true の場合、削除条件にバージョン番号が含まれます。ただしこの場合、削除件数が 0 であっても OptimisticLockException はスローされません。

@Delete(suppressOptimisticLockException = true)
int delete(Employee employee);

returning

returning プロパティで @Returning を指定することで、SQL の DELETE .. RETURNING 句に相当するコードを生成できます。

@Dao
public interface EmployeeDao {
    @Delete(returning = @Returning)
    Employee delete(Employee employee);

    @Delete(returning = @Returning(include = { "employeeId", "version" }))
    Employee deleteReturningIdAndVersion(Employee employee);

    @Delete(returning = @Returning(exclude = { "password" }))
    Employee deleteReturningExceptPassword(Employee employee);

    @Delete(returning = @Returning, suppressOptimisticLockException = true)
    Optional<Employee> deleteOrIgnore(Employee employee);
}

@Returninginclude 要素を使用して、RETURNING 句によって返されるエンティティのプロパティ(データベース列に対応)を指定できます。また、exclude 要素を使用して、返されるべきでないプロパティを指定することもできます。同じエンティティのプロパティが includeexclude の両方の要素に含まれている場合、それは返されません。

戻り値の型は、エンティティクラスまたはエンティティクラスを要素として含む Optional のいずれかでなければなりません。

注釈

この機能は、H2 Database、PostgreSQL、SQL Server、およびSQLiteのダイアレクトのみがサポートしています。

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 をログ出力することを表します。