LoginSignup
0
0

More than 1 year has passed since last update.

Doma2でMergeを利用する

Posted at

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>
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0