カテゴリ: Spring 更新日: 2026/01/14

Javaの@Modifyingアノテーションを徹底解説!初心者でもわかるSpringのデータ操作

Springの@Modifyingアノテーション
Springの@Modifyingアノテーション

先生と生徒の会話形式で理解しよう

生徒

「Springの@Modifyingアノテーションって、どんなときに使うんですか?」

先生

@Modifyingアノテーションは、データベースを更新、削除するクエリを実行するために使うんだよ。通常のSELECT文以外の操作に使うんだ。」

生徒

「なるほど!データを更新したり削除したりするときに必要なんですね。でも、どうやって使うのか具体的に知りたいです。」

先生

「いい質問だね。じゃあ、実際の使い方を見ていこうか!」

1. @Modifyingアノテーションとは?

1. @Modifyingアノテーションとは?
1. @Modifyingアノテーションとは?

Spring Data JPAの@Modifyingアノテーションは、データベースのデータを「読み取る」だけでなく 「更新」「削除」「挿入」するときに使う合図のようなものです。通常の@Queryアノテーションは 基本的にSELECT(検索)用として扱われるため、そのままではUPDATEDELETEの クエリを正しく実行できません。そこで、メソッドに@Modifyingを付けることで、 「このメソッドはデータを変更する処理ですよ」とSpringに教えてあげる必要があります。

イメージとしては、ノートを「読むだけ」のときは何も宣言しませんが、「書き換える」ときには ひとこと断りを入れる、という感じです。データベースの世界でも同じで、JavaとSpring Data JPAを使って レコードを書き換えたり消したりするときには、そのメソッドが変更系の処理であることをはっきり示しておくと、 フレームワーク側がトランザクションなどの動きを正しく準備してくれます。

超シンプルな例として、ユーザー名を変更する処理だけを抜き出すと次のようになります。


public interface UserRepository extends JpaRepository<User, Long> {

    // ユーザー名を変更する例
    @Modifying
    @Query("UPDATE User u SET u.name = :name WHERE u.id = :id")
    void changeName(@Param("id") Long id, @Param("name") String name);
}

このコードでは、@Modifyingが付いていることで、このメソッドが単なる検索ではなく データベース上のユーザー情報を書き換える処理であることがSpringに伝わります。 プログラミング未経験の方は、まず「更新・削除・挿入などの変更を行うクエリには@Modifyingを付ける」 というルールを覚えておくと、後の実装がぐっと理解しやすくなります。

2. 基本的な使い方:データの更新

2. 基本的な使い方:データの更新
2. 基本的な使い方:データの更新

ここからは、実際にデータベースの値を「書き換える」処理を見ていきましょう。 例としてよくあるのが、ECサイトなどで商品の在庫数を減らすパターンです。 「商品が売れたら、在庫数を1つ減らす」という処理は、アプリケーション開発でも頻繁に登場します。 Spring Data JPAでは、このような更新処理をリポジトリのメソッドとして素直に表現できます。

下のコードでは、商品の在庫数を更新するシンプルなサンプルを用意しています。 まずは全体の形をざっくり眺めて、「こういう感じでデータベースを更新するんだな」とイメージをつかんでみてください。


import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;

public interface ProductRepository extends JpaRepository<Product, Long> {

    // 商品の在庫数を更新する
    @Modifying
    @Transactional
    @Query("UPDATE Product p SET p.stock = p.stock - :quantity WHERE p.id = :id")
    int updateStock(@Param("id") Long productId, @Param("quantity") int quantity);
}

このサンプルでは、ProductRepositoryというインターフェースに updateStockというメソッドを定義しています。 @Queryの中には、SQLに似た「UPDATE Product ...」という文を書いており、 指定した商品の在庫数を、渡されたquantityの分だけ減らす、という処理になっています。

ここでポイントになるのが@Modifying@Transactionalです。 @Modifyingは「このメソッドは検索ではなく、データを更新するクエリですよ」という印です。 これを付けることで、Spring Data JPAはUPDATE文を実行しても良いメソッドだと理解してくれます。 一方@Transactionalは、処理全体をひとまとまりの「トランザクション」として扱うための指定で、 途中でエラーが起きた場合には更新前の状態に戻してくれる役割があります。

実際のアプリケーションでは、「注文が入ったらupdateStockを呼び出す」 といった流れになります。コントローラやサービス層から、 「商品ID」と「減らしたい個数」を引数として渡すだけで、 裏側ではUPDATEクエリが実行され、該当するレコードの在庫数が書き換えられます。 プログラミング未経験の方は、まず「更新したい内容を@Queryに書き、 変更系のメソッドには@Modifyingを付ける」というセットで覚えておくと理解しやすくなります。

また、このメソッドは戻り値としてintを返しています。 これは「何件のレコードが更新されたか」という件数で、 正しく更新できたかどうかをチェックするときに役立ちます。 例えば、戻り値が0なら「そのIDの商品が存在しなかったのかもしれない」といった判断ができるので、 エラーメッセージの表示やログ出力にも活用できます。

3. データの削除:@ModifyingとDELETEクエリ

3. データの削除:@ModifyingとDELETEクエリ
3. データの削除:@ModifyingとDELETEクエリ

次は、データベースから不要なデータを「削除」する処理について見ていきましょう。 アプリケーションを長く運用していると、「もう使われない古いデータ」を 定期的に消してスッキリさせたい場面がよくあります。 たとえば、一定期間アクセスされていない注文データを整理するケースです。 こういった削除処理も、Spring Data JPAならリポジトリに1つメソッドを定義するだけで実行できます。

下のサンプルでは、指定した日付より古い注文データをまとめて削除するシンプルな例を紹介します。 プログラミング未経験でも、「条件に合うデータを消す」というイメージがつかみやすい内容です。


import org.springframework.data.jpa.repository.Modifying;
import org.springframework.transaction.annotation.Transactional;

public interface OrderRepository extends JpaRepository<Order, Long> {

    // 古い注文データを削除する
    @Modifying
    @Transactional
    @Query("DELETE FROM Order o WHERE o.createdAt < :date")
    int deleteOldOrders(@Param("date") LocalDate date);
}

このメソッドに付いている@Modifyingは、 「このクエリは検索ではなくデータの削除を行うものですよ」という合図です。 Springはこれを見て、DELETE文を安全に実行する準備をしてくれます。 また@Transactionalを付けることで、 もし削除途中にエラーが発生しても処理が途中で止まらず、 すべてまとめてロールバックされるため安心して利用できます。

戻り値のintには「削除された件数」が入ります。 例えば「5件削除されました」といった結果が返ってくるので、 実際にどれだけのデータが消えたのかを確認するのにも便利です。 バッチ処理や定期的なメンテナンス処理の中でよく使われるパターンなので、 この基本形を覚えておくと削除系のクエリがぐっと扱いやすくなります。

4. @Modifyingアノテーションの注意点

4. @Modifyingアノテーションの注意点
4. @Modifyingアノテーションの注意点

@Modifyingを使う際には以下の点に注意しましょう:

  • トランザクション管理:更新系の処理には@Transactionalを必ず付けるようにしましょう。これにより、エラー発生時にロールバックが可能です。
  • 返り値の型:返り値をintにすることで、更新・削除したレコード数を取得できます。これを利用して処理の成否を判断できます。
  • キャッシュ無効化:エンティティキャッシュを利用している場合、UPDATEDELETE操作後にキャッシュを手動でクリアする必要があることがあります。

5. @Modifyingとネイティブクエリの併用

5. @Modifyingとネイティブクエリの併用
5. @Modifyingとネイティブクエリの併用

@Modifyingは、nativeQuery=trueを使ってネイティブSQLクエリとも組み合わせられます。例えば、複数のテーブルにまたがる更新処理を行うときに便利です。


import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;

public interface UserRepository extends JpaRepository<User, Long> {

    // ユーザーのステータスを一括更新
    @Modifying
    @Transactional
    @Query(value = "UPDATE users u SET u.status = :status WHERE u.last_login < :date", nativeQuery = true)
    int updateUserStatus(@Param("status") String status, @Param("date") LocalDate date);
}

ネイティブクエリを使用することで、より柔軟で効率的なデータ操作が可能です。

まとめ

まとめ
まとめ

@Modifyingアノテーションは、Spring Data JPAでUPDATEやDELETEなどのデータベース変更操作を行う際に必要なアノテーションです。このアノテーションが付与されていないと、SELECT文以外の処理が実行できません。必ず@Transactionalを併用し、エラーが発生した際にはロールバックされるようにすることでデータの整合性を保つことができます。また、ネイティブクエリを使うことで複雑な更新処理にも対応可能です。実際のプロジェクトで使用する際には、トランザクション管理やキャッシュの無効化についても注意する必要があります。

先生と生徒の振り返り会話

生徒

「@Modifyingアノテーションって便利ですね!データを更新・削除するときに使えるのは理解できました。」

先生

「その通り!ただ、必ず@Transactionalもセットで使うことを忘れないようにね。特にデータベースの整合性を保つためには大事だから。」

生徒

「ネイティブクエリとの組み合わせもすごくパワフルですね。次はもっと複雑なクエリも試してみたいです!」

先生

「いいね!どんどん実践していこう。クエリの最適化やパフォーマンスについても学んでいくと、もっとスキルアップできるよ。」

この記事を読んだ人からの質問

この記事を読んだ人からの質問
この記事を読んだ人からの質問

プログラミング初心者からのよくある疑問/質問を解決します

Springの@Modifyingアノテーションは必ず必要ですか?

はい、@Modifyingアノテーションは、Spring Data JPAでUPDATEやDELETEなどのデータ変更を行う際に必須です。@Queryアノテーションだけではデータの更新や削除はできませんので、変更系のクエリには@Modifyingを付ける必要があります。

@Modifyingアノテーションを使うとき、@Transactionalは必要ですか?

はい、@Transactionalを付けることで、トランザクション管理が可能になり、エラー発生時に自動でロールバックされるようになります。データの整合性を保つためにも、@Transactionalをセットで使用するのが推奨されます。

@Modifyingを使ったクエリの返り値の型は何にすべきですか?

通常、返り値はint型にするのが一般的です。int型にすることで、影響を受けたレコード数を取得できるため、処理が成功したかどうかを判定するのに役立ちます。

@Modifyingと@Queryを組み合わせるとき、エンティティのキャッシュはどうなりますか?

Spring Data JPAのエンティティキャッシュを利用している場合、@Modifyingを使ったUPDATEやDELETEの後にキャッシュが更新されないことがあります。そのため、手動でキャッシュをクリアする必要がある場合があります。

@ModifyingアノテーションはINSERT文にも使えますか?

通常、@ModifyingはUPDATEやDELETEで使われますが、INSERT文にも使用することは可能です。ただし、Spring Data JPAでは、エンティティの保存には基本的にsaveメソッドを使うのが一般的です。

ネイティブクエリと@Modifyingを組み合わせることはできますか?

はい、@QueryアノテーションのnativeQuery=trueオプションを使うことで、ネイティブSQLと@Modifyingを組み合わせることができます。これにより、複数のテーブルをまたいだ更新や、JPAがサポートしないSQL構文を使用することが可能になります。

@Modifyingを使わずにUPDATEやDELETEを実行するとどうなりますか?

@Modifyingがないと、@Queryを使ったUPDATEやDELETEのクエリはエラーになります。Spring Data JPAでは、@Modifyingを付けることで、変更系のクエリであることを明示する必要があります。

@Modifyingを使うとパフォーマンスに影響はありますか?

通常のUPDATEやDELETEと同じSQLが実行されるため、大きな影響はありません。ただし、トランザクションの管理やキャッシュの影響で、パフォーマンスに若干の違いが出ることがあります。大量データを更新・削除する場合は注意が必要です。

@Modifyingを使ったメソッドの戻り値をbooleanにできますか?

基本的にはint型で影響を受けたレコード数を取得するのが一般的ですが、戻り値をbooleanにすることも可能です。ただし、削除や更新が行われたかどうかを判定する場合、int型の方が詳細な情報を得られるため推奨されます。

Spring Bootで@Modifyingを使うときのベストプラクティスはありますか?

はい、以下の点に注意するのがベストプラクティスです:
  • @Transactionalを併用してデータの整合性を保つ
  • キャッシュを利用している場合は、適切にクリアする
  • ネイティブクエリを使用する場合は、SQLインジェクションに注意する
  • 返り値をintにして、更新・削除された件数を確認できるようにする
これらを意識することで、安全かつ効率的に@Modifyingを活用できます。

Springの学習を効率化したい方へ

この記事の内容をもっと深く知るには、以下の入門書が最適です。

Spring Framework超入門をAmazonで見る
カテゴリの一覧へ
新着記事
New1
Spring
SpringDataJPAのJPAクエリメソッド「EndingWith」の使い方を完全ガイド!初心者向け解説
更新記事
New2
Spring
SpringDataJPAのJPAクエリメソッド「StartingWith」の使い方を完全ガイド!初心者向け解説
更新記事
New3
Spring
SpringDataJPAのJPAクエリメソッド「NotLike」の使い方を完全ガイド!初心者向け解説
更新記事
New4
Spring
SpringDataJPAのJPAクエリメソッド「Like」の使い方を完全ガイド!初心者向け解説
更新記事
人気記事
No.1
Java&Spring記事人気No1
Spring
Spring BootとJavaの互換性一覧!3.5/3.4/3.3はJava 21・17に対応してる?
No.2
Java&Spring記事人気No2
Java
JavaのBooleanクラスの使い方を完全ガイド!初心者でもわかる真偽値の操作
No.3
Java&Spring記事人気No3
Java
JavaのIOExceptionクラス徹底解説!初心者向けファイル入出力エラー対策ガイド
No.4
Java&Spring記事人気No4
JSP
JSPの基本タグ一覧と使い方まとめ!実務で使えるタグを紹介
No.5
Java&Spring記事人気No5
JSP
JSPでif文・for文を使う方法!初心者でもわかるJavaとの違いと使い方
No.6
Java&Spring記事人気No6
Spring
SpringのBindingResultを完全ガイド!初心者でもわかる入力チェックとエラー処理
No.7
Java&Spring記事人気No7
Spring
SpringのModelクラスとaddAttributeメソッドの使い方を完全ガイド!初心者でも安心
No.8
Java&Spring記事人気No8
Spring
SpringDataJPAのJPAクエリメソッド「EndingWith」の使い方を完全ガイド!初心者向け解説