カテゴリ: Spring 更新日: 2025/06/03

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

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

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

生徒

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

先生

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

生徒

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

先生

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

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を使うメリット

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

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

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

5. 注意点

5. 注意点
5. 注意点

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

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

6. まとめ

6. まとめ
6. まとめ

今回の記事では、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を使ったクエリや複数テーブルの操作について見ていきましょう。」

カテゴリの一覧へ
新着記事
New1
Thymeleaf
Thymeleafのth:selected属性の使い方を完全解説!初心者でもわかるセレクトボックス選択状態の指定方法
更新記事
New2
Java
JavaのBigIntegerクラスとmodメソッドを完全解説!余り計算を初心者向けにやさしく理解しよう
更新記事
New3
Java
JavaのStringクラスとstartsWithメソッドを徹底解説!初心者でもわかる文字列の判定方法
更新記事
New4
Java
JavaのLocalDateTime.compareToメソッドを完全解説!初心者でもわかる日時比較の基本
更新記事
人気記事
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の@Componentアノテーションの使い方を徹底解説!初心者でもわかるSpring Boot入門
No.3
Java&Spring記事人気No3
Java
JavaのRuntimeExceptionを完全解説!初心者でもわかるjava.langパッケージの基礎
No.4
Java&Spring記事人気No4
Spring
Spring BootのMultipartFile入門:ファイルアップロード・ダウンロードの実装方法と制限設定
No.5
Java&Spring記事人気No5
Spring
Spring BootのJakarta移行ガイド!初心者向けjavax→jakarta変更ポイント徹底解説
No.6
Java&Spring記事人気No6
Thymeleaf
Thymeleafのth:classappend属性の使い方を完全ガイド!初心者でもわかる動的クラス追加
No.7
Java&Spring記事人気No7
Spring
Springの@Serviceアノテーションの使い方を徹底解説!初心者でもわかるSpring フレームワーク入門
No.8
Java&Spring記事人気No8
Spring
Javaの@PreAuthorizeアノテーションを完全ガイド!初心者でもわかるメソッドセキュリティ設定