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

SpringのCriteriaBuilderとcreateQueryの使い方を徹底解説!初心者でもわかる動的クエリ作成

CriteriaBuilderのcreateQueryメソッド
CriteriaBuilderのcreateQueryメソッド

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

生徒

「Springでデータベースから特定の条件に合うデータを簡単に取得する方法ってありますか?」

先生

「ありますよ。javax.persistence.criteria.CriteriaBuilderクラスと、そのcreateQueryメソッドを使えば、動的なクエリを簡単に作成できます。」

生徒

「動的なクエリってどういうものですか?」

先生

「条件を柔軟に変更できるクエリのことです。CriteriaBuilderを使えば、条件をプログラム的に追加できます。具体例を見てみましょう!」

1. CriteriaBuilderとcreateQueryとは?

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

1. CriteriaBuilderとcreateQueryとは?
1. CriteriaBuilderとcreateQueryとは?

Springでは、データベース操作を簡単に行うためにJPAを利用します。その中でCriteriaBuilderクラスは、型安全な方法で動的クエリを構築するためのクラスです。

一方で、createQueryメソッドは、CriteriaBuilderが提供する機能の一つで、実際にクエリを生成するために使用されます。これにより、SQLを直接記述する必要なく、柔軟なデータベース検索が可能になります。

2. createQueryの基本的な使い方

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

まずはCriteriaBuilderを使った基本的なクエリの作成方法を見てみましょう。以下のコードでは、従業員テーブルから「Sales」部門のデータを取得しています。


import javax.persistence.*;
import javax.persistence.criteria.*;
import java.util.List;

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

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

            // createQueryメソッドでCriteriaQueryを作成
            CriteriaQuery<Employee> cq = cb.createQuery(Employee.class);

            // ルートエンティティを設定
            Root<Employee> root = cq.from(Employee.class);

            // 条件を設定
            Predicate condition = cb.equal(root.get("department"), "Sales");
            cq.select(root).where(condition);

            // クエリの実行
            List<Employee> employees = em.createQuery(cq).getResultList();

            // 結果を出力
            employees.forEach(e -> System.out.println(e.getName()));
        } finally {
            em.close();
            emf.close();
        }
    }
}

3. createQueryの実行結果

3. createQueryの実行結果
3. createQueryの実行結果

上記のコードを実行すると、"Sales"部門に所属する従業員の名前が出力されます。以下はその例です:


John Doe
Jane Smith

4. CriteriaBuilderとcreateQueryを使うメリット

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

4. CriteriaBuilderとcreateQueryを使うメリット
4. CriteriaBuilderとcreateQueryを使うメリット

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

  • 動的な条件設定:クエリ内の条件をプログラム的に変更可能。
  • 型安全性:コンパイル時にエラーを検知できる。
  • 複雑なクエリの構築:集計やグループ化なども対応可能。

これにより、大規模なアプリケーションでも効率的にデータベース操作ができます。

5. 注意点

5. 注意点
5. 注意点

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

  • エンティティのマッピングが正しいことを確認する。
  • 不要なクエリが実行されないように条件を明確に定義する。
  • クエリが複雑になりすぎる場合はパフォーマンスに注意する。

6. 複数条件を指定したcreateQueryの使い方

6. 複数条件を指定したcreateQueryの使い方
6. 複数条件を指定したcreateQueryの使い方

createQueryを使用する場合、複数の条件を組み合わせた検索も可能です。 CriteriaBuilderandorメソッドを使うことで、 条件を柔軟に追加できます。

以下の例では、部署が「Sales」で、かつ年齢が30以上の従業員を検索しています。


import javax.persistence.*;
import javax.persistence.criteria.*;
import java.util.List;

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

        try {
            CriteriaBuilder cb = em.getCriteriaBuilder();
            CriteriaQuery<Employee> cq = cb.createQuery(Employee.class);
            Root<Employee> root = cq.from(Employee.class);

            Predicate department = cb.equal(root.get("department"), "Sales");
            Predicate age = cb.greaterThanOrEqualTo(root.get("age"), 30);

            cq.select(root).where(cb.and(department, age));

            List<Employee> employees = em.createQuery(cq).getResultList();

            employees.forEach(e -> System.out.println(e.getName()));
        } finally {
            em.close();
            emf.close();
        }
    }
}

このように、複数の条件を組み合わせることで、より細かい検索条件を設定できます。

7. createQueryで並び替えを行う方法

「7. createQueryで並び替えを行う方法」の重要ポイントを、初心者の方にも分かりやすく簡潔に解説します。

7. createQueryで並び替えを行う方法
7. createQueryで並び替えを行う方法

CriteriaBuildercreateQueryを利用すると、 検索結果の並び替え(ソート)も簡単に実装できます。

orderByメソッドを使用することで、昇順または降順でデータを取得できます。


import javax.persistence.*;
import javax.persistence.criteria.*;
import java.util.List;

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

        try {
            CriteriaBuilder cb = em.getCriteriaBuilder();
            CriteriaQuery<Employee> cq = cb.createQuery(Employee.class);
            Root<Employee> root = cq.from(Employee.class);

            cq.select(root);
            cq.orderBy(cb.asc(root.get("name")));

            List<Employee> employees = em.createQuery(cq).getResultList();

            employees.forEach(e -> System.out.println(e.getName()));
        } finally {
            em.close();
            emf.close();
        }
    }
}

この例では、従業員名を基準に昇順で並び替えてデータを取得しています。

8. createQueryで集計処理を行う方法

8. createQueryで集計処理を行う方法
8. createQueryで集計処理を行う方法

CriteriaBuilderは、検索だけでなく集計処理にも利用できます。 例えば、レコード数を数える場合にはcount関数を使用します。

以下のコードでは、従業員テーブルの総レコード数を取得しています。


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

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

        try {
            CriteriaBuilder cb = em.getCriteriaBuilder();
            CriteriaQuery<Long> cq = cb.createQuery(Long.class);
            Root<Employee> root = cq.from(Employee.class);

            cq.select(cb.count(root));

            Long count = em.createQuery(cq).getSingleResult();
            System.out.println("従業員数: " + count);
        } finally {
            em.close();
            emf.close();
        }
    }
}

このように、countなどの関数を利用することで、 データの統計情報を簡単に取得できます。

まとめ

まとめ
まとめ

今回の記事では、SpringのCriteriaBuildercreateQueryの使い方を中心に解説しました。CriteriaBuilderは、動的な条件設定を型安全に行うための便利なクラスであり、createQueryメソッドを使うことで、エンティティを柔軟に操作できることを学びました。

また、実際のコード例を通じて、特定の条件に一致するデータを取得する基本的な方法を理解できたはずです。PredicateRootの概念も登場しましたが、これらを組み合わせることで、複雑なクエリを簡潔に記述できます。

実務でCriteriaBuilderを使う際には、データベースのパフォーマンスやエンティティのマッピング設定にも注意が必要です。特に複数の条件やグループ化を含むクエリを扱う際には、CriteriaBuilderの柔軟性が大いに役立つでしょう。

以下に、集計とグループ化を含むCriteriaBuilderの応用例を紹介します。


import javax.persistence.*;
import javax.persistence.criteria.*;
import java.util.List;

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

        try {
            CriteriaBuilder cb = em.getCriteriaBuilder();

            // createQueryメソッドでCriteriaQueryを作成
            CriteriaQuery<Object[]> cq = cb.createQuery(Object[].class);

            // ルートエンティティを設定
            Root<Employee> root = cq.from(Employee.class);

            // グループ化と集計
            cq.multiselect(root.get("department"), cb.count(root));
            cq.groupBy(root.get("department"));

            // クエリの実行
            List<Object[]> results = em.createQuery(cq).getResultList();

            // 結果を出力
            results.forEach(row -> System.out.println("Department: " + row[0] + ", Count: " + row[1]));
        } finally {
            em.close();
            emf.close();
        }
    }
}

このコードでは、部門ごとの従業員数を集計しています。以下はその出力例です。


Department: Sales, Count: 10
Department: IT, Count: 8
Department: HR, Count: 5
先生と生徒の振り返り会話

生徒

「今日はCriteriaBuildercreateQueryについて学びました。これを使えば、SQLを書かなくても複雑なクエリが作れるんですね!」

先生

「その通りです。特に動的な条件や集計、グループ化が必要な場合に役立ちますね。型安全である点も重要です。」

生徒

「部門ごとの従業員数を数える例は、実務でも使えそうです!次はもっと複雑な条件やJoinについても学びたいです。」

先生

「いいですね!次回はJoinを使ったクエリや複数テーブルの操作について見ていきましょう。」

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

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

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

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

Spring FrameworkのCriteriaBuilderとは何ですか?初心者にもわかりやすく教えてください。

Spring Frameworkにおいて、CriteriaBuilder(クライテリアビルダー)とは、データベース(DB)操作を行うJPA(Java Persistence API)の中で提供される、動的クエリを構築するための非常に便利なクラスです。通常、データベースからデータを取得する際はSQL文という専用の言語を書く必要がありますが、CriteriaBuilderを使うことで、Javaのプログラムコードとして「型安全」に検索条件やクエリを組み立てることができます。これにより、文字列でSQLを書く際によく発生するタイポ(打ち間違い)をコンパイル時に検知できるという大きなメリットがあります。特に検索画面などで、ユーザーの入力に応じて検索条件が増えたり減ったりするような「動的なクエリ」を作成する場面で真価を発揮します。

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を読み込む基本!外部ファイルのパス指定に注意しよう