Doma2でMergeを利用することがあったので、メモとして残しておきます。
といってもそれほど難しいことはなく、まずはDaoインタフェースを用意します。
@Dao
@ConfigAutowireable
public interface InventoryDao {
/**
* 入荷予定をもとに在庫数を更新する。入荷予定に対する現在在庫が存在しない場合は、在庫データを作成する。
* @param dt 入荷予定日
* @return 挿入・更新件数
*/
@Update(sqlFile = true)
int mergeInventoryUsingReceipt(LocalDate dt);
}
ここで注意するのは、@Update
アノテーションを付与すること、戻り値をint
にすることです。この戻り値は更新・挿入・削除した件数になります。
あとはこのDaoインターフェースに対応するMerge文を用意すればよいです。
MERGE inventory AS I
USING (
SELECT *
FROM receipt
WHERE dt = /* dt */'2022-04-23'
) R
ON I.item = R.item
WHEN MATCHED THEN UPDATE SET I.qty = I.qty + R.qty
WHEN NOT MATCHED THEN INSERT (item, qty) VALUES (R.item, R.qty);
稼働確認環境(pom.xml
抜粋)
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.7</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<java.version>8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-batch</artifactId>
</dependency>
<dependency>
<groupId>org.seasar.doma.boot</groupId>
<artifactId>doma-spring-boot-starter</artifactId>
<version>1.6.0</version>
</dependency>
<dependency>
<groupId>org.seasar.doma</groupId>
<artifactId>doma-processor</artifactId>
<version>2.50.0</version>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>mssql-jdbc</artifactId>
<scope>runtime</scope>
</dependency>
</dependencies>