カテゴリ: Spring 更新日: 2026/04/27

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について学びましょう。」

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

「この記事を読んだ人からの質問」の重要ポイントを、初心者の方にも分かりやすく簡潔に解説します。

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

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

Spring FrameworkのCriteriaBuilderとは、具体的にどのような役割を持つクラスなのですか?初心者にもわかりやすく教えてください。

Spring Framework(スプリングフレームワーク)のJPA機能の一部であるCriteriaBuilderは、データベースに対するクエリ(命令)をJavaのプログラム上で組み立てるための非常に便利なクラスです。通常、データベースを操作するにはSQLという言語を直接書く必要がありますが、CriteriaBuilderを使うことで、Javaのコードとして型安全に、かつ動的に検索や更新の条件を作成できる役割を持っています。初心者の方にとっては、文字列で複雑な命令を書くよりも、Javaのメソッドを呼び出す形でデータベース操作ができるため、記述ミスを防ぎやすいという大きなメリットがあります。

Spring FrameworkやThymeleafを使った Webアプリ開発の全体像をやさしく理解したい人には、 この入門書が定番です。

Spring Framework超入門をAmazonで見る

※ Amazon広告リンク

カテゴリの一覧へ
新着記事
New1
Spring
Spring の@RequestParamの使い方!テキストボックス、ラジオボタン、チェックボックス、セレクトボックスの値を受け取る。
更新記事
New2
JSP
EL式の基本構文まとめ!${}で使う書き方のルールを解説
更新記事
New3
Java
JavaのBigIntegerとisProbablePrimeメソッドを完全解説!初心者でもわかる素数判定
更新記事
New4
JSP
JSPで発生する主なエラーとは?初心者向けに原因と対処法をやさしく解説
新規投稿
人気記事
No.1
Java&Spring記事人気No1
JSP
JSPのおすすめ学習・用語まとめ【2026年最新版】初心者が知っておきたい基本をやさしく解説
No.2
Java&Spring記事人気No2
Java
Javaのクラスとインスタンス化、コンストラクタの使い方完全ガイド!初心者でもわかるオブジェクト指向の基礎
No.3
Java&Spring記事人気No3
Spring
Springの@Serviceアノテーションの使い方を徹底解説!初心者でもわかるSpring フレームワーク入門
No.4
Java&Spring記事人気No4
Spring
Thymeleaf(タイムリーフ)入門!初心者でもわかるSpring Bootとテンプレートエンジンの使い方
No.5
Java&Spring記事人気No5
Spring
Javaの@PreAuthorizeアノテーションを完全ガイド!初心者でもわかるメソッドセキュリティ設定
No.6
Java&Spring記事人気No6
Spring
Springの@Queryアノテーションを徹底解説!初心者でもわかるSpring Bootのカスタムクエリ
No.7
Java&Spring記事人気No7
Java
JavaのExceptionクラスを完全解説!初心者でも理解できる例外処理の基本
No.8
Java&Spring記事人気No8
JSP
JSPでCSSやJSを読み込む基本!外部ファイルのパス指定に注意しよう