カテゴリ: Spring 更新日: 2026/03/31

SpringのCriteriaBuilderとcreateCriteriaUpdateの使い方を徹底解説!初心者でもわかるデータ更新方法

CriteriaBuilderのcreateCriteriaUpdateメソッド
CriteriaBuilderのcreateCriteriaUpdateメソッド

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

生徒

「Springでデータベースのデータを簡単に更新する方法ってありますか?」

先生

「はい、CriteriaBuilderクラスのcreateCriteriaUpdateメソッドを使えば、特定の条件を指定してデータを効率的に更新できます。」

生徒

「普通のJPQLとどう違うんですか?」

先生

createCriteriaUpdateは、動的な条件を柔軟に設定できるのが特徴です。具体例を見てみましょう!」

1. CriteriaBuilderとcreateCriteriaUpdateとは?

「1. CriteriaBuilderとcreateCriteriaUpdateとは?」の重要ポイントを、初心者の方にも分かりやすく簡潔に解説します。

1. CriteriaBuilderとcreateCriteriaUpdateとは?
1. CriteriaBuilderとcreateCriteriaUpdateとは?

CriteriaBuilderは、Springが提供するJPAの一部で、型安全なクエリを動的に作成するためのクラスです。createCriteriaUpdateメソッドは、その中でもデータ更新を行うための機能を提供します。

通常のJPQLを使う場合、固定的なクエリを記述する必要がありますが、createCriteriaUpdateを使えば、動的に条件や更新内容を設定することができます。これにより、柔軟かつ効率的なデータ操作が可能です。

2. createCriteriaUpdateの基本的な使い方

2. createCriteriaUpdateの基本的な使い方
2. createCriteriaUpdateの基本的な使い方

以下の例では、従業員テーブルの部門名を「Marketing」に更新する方法を説明します。


import javax.persistence.*;
import javax.persistence.criteria.*;

public class CriteriaUpdateExample {
    public static void main(String[] args) {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("examplePU");
        EntityManager em = emf.createEntityManager();

        try {
            em.getTransaction().begin();

            // CriteriaBuilderのインスタンスを取得
            CriteriaBuilder cb = em.getCriteriaBuilder();

            // createCriteriaUpdateでCriteriaUpdateを作成
            CriteriaUpdate<Employee> update = cb.createCriteriaUpdate(Employee.class);

            // 更新対象のエンティティを指定
            Root<Employee> root = update.from(Employee.class);

            // 更新内容を設定
            update.set(root.get("department"), "Marketing");

            // 条件を設定
            update.where(cb.equal(root.get("department"), "Sales"));

            // 更新クエリの実行
            int updatedRows = em.createQuery(update).executeUpdate();

            System.out.println("Updated rows: " + updatedRows);

            em.getTransaction().commit();
        } finally {
            em.close();
            emf.close();
        }
    }
}

3. createCriteriaUpdateの実行結果

3. createCriteriaUpdateの実行結果
3. createCriteriaUpdateの実行結果

上記のコードを実行すると、"Sales"部門の従業員が"Marketing"部門に移動されます。以下は実行結果の例です。


Updated rows: 5

4. createCriteriaUpdateを使うメリット

「4. createCriteriaUpdateを使うメリット」の重要ポイントを、初心者の方にも分かりやすく簡潔に解説します。

4. createCriteriaUpdateを使うメリット
4. createCriteriaUpdateを使うメリット

createCriteriaUpdateを使うことで、以下のようなメリットがあります:

  • 動的な条件設定:更新条件をプログラム的に変更可能。
  • 効率的なデータ更新:複数のエンティティを一度に更新できる。
  • 型安全性:クエリ内のフィールドや値が型安全に管理される。

これにより、大規模なデータ操作や複雑な更新ロジックの実装が容易になります。

5. 注意点

5. 注意点
5. 注意点

createCriteriaUpdateを使用する際には、以下の点に注意してください:

  • トランザクション管理:更新操作にはトランザクションが必要です。
  • 更新対象の確認:条件を正しく設定しないと、予期しないデータが更新される可能性があります。
  • エンティティの管理:エンティティのキャッシュが正しく同期されるように注意が必要です。

6. 複数の項目を同時に更新する方法

6. 複数の項目を同時に更新する方法
6. 複数の項目を同時に更新する方法

CriteriaUpdateでは、setメソッドを繰り返し呼び出すことで、一度のクエリで複数のカラムを同時に更新することが可能です。これにより、データベースへのアクセス回数を減らし、パフォーマンスを向上させることができます。

以下の例では、特定の従業員の役職と給与を同時に更新しています。


// 複数の更新内容を設定
update.set(root.get("title"), "Manager");
update.set(root.get("salary"), 500000);

// IDが101の従業員を対象にする
update.where(cb.equal(root.get("id"), 101));

// 実行
int updatedRows = em.createQuery(update).executeUpdate();

このように、メソッドチェーンのように記述することで、複雑な更新処理も直感的に実装できます。

7. 動的な条件分岐(Predicate)の活用

「7. 動的な条件分岐(Predicate)の活用」の重要ポイントを、初心者の方にも分かりやすく簡潔に解説します。

7. 動的な条件分岐(Predicate)の活用
7. 動的な条件分岐(Predicate)の活用

CriteriaBuilderの真価は、プログラムの実行時に条件を組み立てられる点にあります。例えば、検索画面の入力値がある場合だけ更新条件を追加する、といったロジックが簡単に記述できます。

Predicate(述語)のリストを使用して、動的に条件を構成する例を見てみましょう。


CriteriaUpdate<Employee> update = cb.createCriteriaUpdate(Employee.class);
Root<Employee> root = update.from(Employee.class);

List<Predicate> predicates = new ArrayList<>();

// 特定の条件(例:ステータスが有効な場合のみ)
if (onlyActive) {
    predicates.add(cb.equal(root.get("status"), "ACTIVE"));
}

// リストに溜めた条件をwhere句に適用
update.where(predicates.toArray(new Predicate[0]));
update.set(root.get("lastUpdate"), new Date());

em.createQuery(update).executeUpdate();

文字列結合でクエリを作るのと違い、構文エラーを防ぎながら安全に条件を拡張できるのが大きな強みです。

8. CriteriaUpdateと永続性コンテキストの同期

8. CriteriaUpdateと永続性コンテキストの同期
8. CriteriaUpdateと永続性コンテキストの同期

executeUpdateを使用して一括更新を行う際、最も注意すべき点は「永続性コンテキスト(EntityManagerのキャッシュ)」との不整合です。このメソッドはデータベースを直接更新するため、メモリ上に読み込まれているエンティティには反映されません。

一括更新を安全に行うための主な対策は以下の通りです:

  • 更新後のリフレッシュ:すでにfind等で取得済みのオブジェクトがある場合、em.refresh(entity)を呼び出して最新状態を読み込む。
  • 実行順序の考慮:一括更新を行った直後に、そのデータを使用する処理を書かない。
  • クリアの検討:大量のデータを更新した後はem.clear()でキャッシュを空にし、再度データベースから取得するようにする。

この特性を理解していないと、「データベース上は更新されているのに、画面上の表示が変わらない」といったバグの原因になるため注意しましょう。

まとめ

まとめ
まとめ

本記事では、SpringのCriteriaBuilderクラスとcreateCriteriaUpdateメソッドを活用したデータ更新方法について解説しました。createCriteriaUpdateは、JPQLでは難しい動的条件を簡単に設定でき、型安全な方法で効率的にデータを更新するのに非常に有用です。

また、トランザクション管理や条件設定の重要性についても触れました。これらのポイントを理解することで、安全で柔軟なデータベース操作が可能となります。特に実務では、大規模なデータ更新や複雑な条件に対応する機会が多いため、今回の内容を活用して、パフォーマンス向上に役立ててください。

以下に、もう少し複雑な条件を設定したcreateCriteriaUpdateの例を示します。


import javax.persistence.*;
import javax.persistence.criteria.*;

public class ComplexCriteriaUpdate {
    public static void main(String[] args) {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("examplePU");
        EntityManager em = emf.createEntityManager();

        try {
            em.getTransaction().begin();

            // CriteriaBuilderのインスタンスを取得
            CriteriaBuilder cb = em.getCriteriaBuilder();

            // createCriteriaUpdateでCriteriaUpdateを作成
            CriteriaUpdate<Employee> update = cb.createCriteriaUpdate(Employee.class);

            // 更新対象のエンティティを指定
            Root<Employee> root = update.from(Employee.class);

            // 更新内容を設定
            update.set(root.get("department"), "Research & Development");

            // 複数の条件を設定
            update.where(
                cb.and(
                    cb.equal(root.get("department"), "Marketing"),
                    cb.greaterThan(root.get("salary"), 50000)
                )
            );

            // 更新クエリの実行
            int updatedRows = em.createQuery(update).executeUpdate();

            System.out.println("Updated rows: " + updatedRows);

            em.getTransaction().commit();
        } finally {
            em.close();
            emf.close();
        }
    }
}

このコードでは、「Marketing」部門でかつ給与が50,000以上の従業員の部門を「Research & Development」に更新しています。

以下は実行結果の例です。


Updated rows: 3
先生と生徒の振り返り会話

生徒

「今日はcreateCriteriaUpdateを使ったデータ更新方法を学びました。動的に条件を設定できるのが便利ですね!」

先生

「その通りです。特に実務では、複雑な条件を扱うことが多いので、この方法は非常に役立ちます。」

生徒

「複数条件を設定してデータを更新する例もわかりやすかったです。次は削除操作について学びたいです!」

先生

「いいですね!次回はcreateCriteriaDeleteについて学びましょう。」

カテゴリの一覧へ
新着記事
New1
Servlet
JavaのGenericServletクラスのgetInitParameterNamesメソッドを徹底解説!初心者でもわかる初期化パラメータの取得方法
更新記事
New2
JSP
JSPとは何か?初心者向けにできること・仕組み・特徴をやさしく解説
更新記事
New3
Servlet
JavaのHttpServletRequestクラスとgetRemoteAddrメソッドを初心者向けに徹底解説!
更新記事
New4
Thymeleaf
Thymeleafのth:srcの使い方を完全ガイド!初心者でもわかる画像やリソース設定
更新記事
人気記事
No.1
Java&Spring記事人気No1
Spring
Spring BootとJavaの互換性一覧!3.5/3.4/3.3はJava 21・17に対応してる?
No.2
Java&Spring記事人気No2
Spring
Springの@Serviceアノテーションの使い方を徹底解説!初心者でもわかるSpring フレームワーク入門
No.3
Java&Spring記事人気No3
Servlet
JavaのHttpSessionを徹底解説!初心者でもわかるセッション管理の基本
No.4
Java&Spring記事人気No4
Java
Java開発環境「Eclipse(Pleiades)」のインストール方法とメリットを初心者向けに解説
No.5
Java&Spring記事人気No5
JSP
JSPの基本タグ一覧と使い方まとめ!実務で使えるタグを紹介
No.6
Java&Spring記事人気No6
Spring
Spring BootとVS Codeで開発を始めよう!拡張機能・launch.json・ホットリロードを丁寧に解説
No.7
Java&Spring記事人気No7
Spring
Springの@Componentアノテーションの使い方を徹底解説!初心者でもわかるSpring Boot入門
No.8
Java&Spring記事人気No8
Java
Javaの@SuppressWarningsアノテーションの使い方を完全ガイド!初心者でもわかる警告の抑制方法