DELETEクエリ

削除のためのクエリ

概要

DELETEクエリはQueryDsldeleteとそれに続く関数を呼び出して構築します。

single

エンティティ1件を削除するにはsingleを呼び出します。

val address: Address = ..
val query: Query<Unit> = QueryDsl.delete(a).single(address)
/*
delete from ADDRESS as t0_ where t0_.ADDRESS_ID = ? and t0_.VERSION = ?
*/

下記のマッピング定義に応じて、発行されるSQLに適切な値が反映されます。

  • @KomapperId
  • @KomapperVersion

クエリ実行時に楽観的排他制御が失敗した場合、org.komapper.core.OptimisticLockExceptionがスローされます。

クエリ実行時にエンティティが見つからなかった場合、org.komapper.core.EntityNotFoundExceptionがスローされます。

batch

バッチでエンティティ複数件を削除するにはbatchを呼び出します。

val address1: Address = ..
val address2: Address = ..
val address3: Address = ..
val query: Query<Unit> = QueryDsl.delete(a).batch(address1, address2, address3)
/*
delete from ADDRESS as t0_ where t0_.ADDRESS_ID = ? and t0_.VERSION = ?
delete from ADDRESS as t0_ where t0_.ADDRESS_ID = ? and t0_.VERSION = ?
delete from ADDRESS as t0_ where t0_.ADDRESS_ID = ? and t0_.VERSION = ?
*/

下記のマッピング定義に応じて、発行されるSQLに適切な値が反映されます。

  • @KomapperId
  • @KomapperVersion

クエリ実行時に楽観的排他制御が失敗した場合、org.komapper.core.OptimisticLockExceptionがスローされます。

クエリ実行時にエンティティが見つからなかった場合、org.komapper.core.EntityNotFoundExceptionがスローされます。

all

全件を削除するにはallを呼び出します。

val query: Query<Long> = QueryDsl.delete(e).all() }
/*
delete from EMPLOYEE as t0_
*/

このクエリを実行した場合の戻り値は削除された件数です。

where

任意の条件にマッチする行を削除するにはwhereを呼び出します。

val query: Query<Long> = QueryDsl.delete(a).where { a.addressId eq 15 }
/*
delete from ADDRESS as t0_ where t0_.ADDRESS_ID = ?
*/

デフォルトではWHERE句の指定は必須です。もしwhereのブロック内で条件が指定されない場合は例外が発生します。 意図的に全件削除を認めたい場合はoptionsを呼び出してallowMissingWhereClausetrueを設定します。

val query: Query<Long> = QueryDsl.delete(e).where {}.options { it.copy(allowMissingWhereClause = true) }
/*
delete from EMPLOYEE as t0_
*/

このクエリを実行した場合の戻り値は削除された件数です。

returning

以下の関数の後続でreturning関数を呼び出すことで、削除された値を取得できます。

  • single
  • where

single関数の後続でreturning関数を呼び出す例です。

val address: Address = ..
val query: Query<Address?> = QueryDsl.delete(a).single(address).returning()
/*
delete from ADDRESS where ADDRESS_ID = ? and VERSION = ? returning ADDRESS_ID, STREET, VERSION
*/

returning関数にプロパティを指定することで取得対象のカラムを限定できます。

val query: Query<Int?> = QueryDsl.delete(a).single(address).returning(a.addressId)
/*
delete from ADDRESS where ADDRESS_ID = ? and VERSION = ? returning ADDRESS_ID
*/
val query: Query<Pair<Int?, String?>?> = QueryDsl.delete(a).single(address).returning(a.addressId, a.street)
/*
delete from ADDRESS where ADDRESS_ID = ? and VERSION = ? returning ADDRESS_ID, STREET
*/
val query: Query<Triple<Int?, String?, Int?>?> = QueryDsl.delete(a).single(address).returning(a.addressId, a.street, a.version)
/*
delete from ADDRESS where ADDRESS_ID = ? and VERSION = ? returning ADDRESS_ID, STREET, VERSION
*/

options

クエリの挙動をカスタマイズするにはoptionsを呼び出します。 ラムダ式のパラメータはデフォルトのオプションを表します。 変更したいプロパティを指定してcopyメソッドを呼び出してください。

val address: Address = ..
val query: Query<Unit> = QueryDsl.delete(a).single(address).options {
    it.copy(
      queryTimeoutSeconds = 5
    )
}

指定可能なオプションには以下のものがあります。

allowMissingWhereClause
空のWHERE句を認めるかどうかです。デフォルトはfalseです。
escapeSequence
LIKE句に指定されるエスケープシーケンスです。デフォルトはnullDialectの値を使うことを示します。
batchSize
バッチサイズです。デフォルトはnullです。
disableOptimisticLock
楽観的ロックを無効化するかどうかです。デフォルトはfalseです。この値がtrueのときWHERE句にバージョン番号が含まれません。
queryTimeoutSeconds
クエリタイムアウトの秒数です。デフォルトはnullでドライバの値を使うことを示します。
suppressLogging
SQLのログ出力を抑制するかどうかです。デフォルトはfalseです。
suppressOptimisticLockException
楽観的ロックの取得に失敗した場合にOptimisticLockExceptionのスローを抑制するかどうかです。デフォルトはfalseです。
suppressEntityNotFoundException
エンティティが見つからない場合にEntityNotFoundExceptionのスローを抑制するかどうかです。デフォルトはfalseです。

executionOptions の同名プロパティよりもこちらに明示的に設定した値が優先的に利用されます。