複数行追加

複数行の追加を実行するために @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

ただし、SQL Server の場合、この機能はauto-incrementのプライマリキーを持つテーブル上では実行できません。

戻り値の型

Iterable パラメータの型引数が immutable なエンティティクラスの場合、戻り値の型はそのエンティティクラスを要素とする org easar.doma.jdbc.MultiResult でなければいけません。

Iterable パラメータの型引数が変更可能なエンティティクラスの場合、戻り値の型は更新された件数を表す int でなければなりません。

パラメータの型

パラメータの型はエンティティクラスを要素とする``java.lang.Iterable`` のサブタイプでなければなりません。

パラメータは null であってはいけません。

自動生成される値

複数行追加の実行時に、自動生成された値がエンティティプロパティに設定されます。

識別子

IDの生成 を参照してください。

バージョン番号

アプリケーションがバージョンプロパティに値を設定しない場合や 0 より小さい値を設定する場合、1 が最終的にそのプロパティに設定されます。

アプリケーションが 0 より大きい値を明示的にバージョンプロパティに設定した場合、自動生成は行われません。

バージョン も参照してください。

@MultiInsert のプロパティ

exclude

@MultiInsertexclude プロパティで指定されたエンティティプロパティは、追加の対象から除外されます。 たとえそれらが @Column 注釈で insertable に設定されていたとしてもです。

@MultiInsert(exclude = {"name", "salary"})
int insert(List<Employee> employees);

include

@MultiInsertinclude プロパティに指定されたエンティティプロパティのみが追加の対象に含まれます。

excludeinclude の両方のプロパティに同じエンティティプロパティが指定されている場合、そのエンティティプロパティは追加の対象には含まれません。

@Column 注釈で insertablefalse に設定されたエンティティプロパティは追加対象には含まれません。 include プロパティで指定されていたとしても含まれません。

@MultiInsert(include = {"name", "salary"})
int insert(List<Employee> employees);

一意制約違反

一意制約違反が発生した場合、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 をログ出力することを表します。