複数行追加
複数行の追加を実行するために @MultiInsert を使用して DAO メソッドに注釈を付けます。
@Dao
public interface EmployeeDao {
@MultiInsert
int insert(List<Employee> employees);
@MultiInsert
MultiResult<ImmutableEmployee> insert(List<ImmutableEmployee> employees);
}
複数行の追加を使用すると、次のような SQL ステートメントを発行できます。
insert into EMPLOYEE (EMPLOYEE_ID, EMPLOYEE_NO, EMPLOYEE_NAME, AGE, VERSION)
values (?, ?, ?, ?, ?), (?, ?, ?, ?, ?)
エンティティリスナーの preInsert メソッドは、パラメータの エンティティクラス でエンティティリスナーが指定されている場合、追加の実行前に各エンティティごとに呼び出されます。また、エンティティリスナーメソッドの postInsert メソッドは、追加の実行後に各エンティティごとに呼び出されます。
注釈
この機能をサポートするデータベースは次のとおりです。
H2
MySQL
PostgreSQL
SQL Server
Oracle Database
ただし、SQL Server および Oracle の場合、この機能はauto incrementなプライマリキーを持つテーブルでは実行できません。
戻り値の型
Iterable パラメータの型引数が immutable なエンティティクラスの場合、戻り値の型はそのエンティティクラスを要素とする org easar.doma.jdbc.MultiResult でなければいけません。
Iterable パラメータの型引数が変更可能なエンティティクラスの場合、戻り値の型は更新された件数を表す int でなければなりません。
パラメータの型
パラメータの型はエンティティクラスを要素とする``java.lang.Iterable`` のサブタイプでなければなりません。
パラメータは null であってはいけません。
自動生成される値
複数行追加の実行時に、自動生成された値がエンティティプロパティに設定されます。
識別子
IDの生成 を参照してください。
バージョン番号
アプリケーションがバージョンプロパティに値を設定しない場合や 0 より小さい値を設定する場合、1 が最終的にそのプロパティに設定されます。
アプリケーションが 0 より大きい値を明示的にバージョンプロパティに設定した場合、自動生成は行われません。
バージョン も参照してください。
@MultiInsert のプロパティ
exclude
@MultiInsert の exclude プロパティで指定されたエンティティプロパティは、追加の対象から除外されます。 たとえそれらが @Column 注釈で insertable に設定されていたとしてもです。
@MultiInsert(exclude = {"name", "salary"})
int insert(List<Employee> employees);
include
@MultiInsert の include プロパティに指定されたエンティティプロパティのみが追加の対象に含まれます。
exclude と include の両方のプロパティに同じエンティティプロパティが指定されている場合、そのエンティティプロパティは追加の対象には含まれません。
@Column 注釈で insertable が false に設定されたエンティティプロパティは追加対象には含まれません。 include プロパティで指定されていたとしても含まれません。
@MultiInsert(include = {"name", "salary"})
int insert(List<Employee> employees);
duplicateKeyType
このプロパティは、追加操作時に重複したキーを処理するための戦略を定義します。
次の3つの値のいずれかを取ることができます:
DuplicateKeyType.UPDATE: 重複したキーが見つかった場合、テーブル内の既存の行が更新されます。DuplicateKeyType.IGNORE: 重複したキーが見つかった場合、挿入操作は無視され、テーブルに変更は加えられません。DuplicateKeyType.EXCEPTION: 重複したキーが発生した場合、例外が投げられます。
@MultiInsert(duplicateKeyType = DuplicateKeyType.UPDATE)
int insert(List<Employee> employees);
duplicateKeys
このプロパティは、重複キーが存在するかどうかを判断するために使用するキーを表します。 重複キーが存在する場合、重複キーを処理するために duplicateKeyType ストラテジーを使用します。
@MultiInsert(duplicateKeyType = DuplicateKeyType.UPDATE, duplicateKeys = {"employeeNo"})
int insert(List<Employee> employees);
注釈
このプロパティは、duplicateKeyType ストラテジーが DuplicateKeyType.UPDATE または DuplicateKeyType.IGNORE のいずれかである場合にのみ使用されます。
注釈
MySQLの方言はこのプロパティを利用しません。
一意制約違反
一意制約違反が発生した場合、org.seasar.doma.jdbc.UniqueConstraintException がスローされます。
クエリタイムアウト
@MultiInsert アノテーション内の queryTimeout プロパティにクエリタイムアウトの秒数を指定できます。
@MultiInsert(queryTimeout = 10)
int insert(List<Employee> employees);
queryTimeout プロパティの値が設定されていない場合は、 ../config で指定されたクエリタイムアウトが使用されます。
SQLログの出力形式
@MultiInsert アノテーション内の sqlLog プロパティに SQL ログの出力形式を指定できます。
@MultiInsert(sqlLog = SqlLogType.RAW)
int insert(List<Employee> employees);
SqlLogType.RAW はバインドパラメータ付きの SQL をログ出力することを表します。