カテゴリ: 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を使ったクエリや複数テーブルの操作について見ていきましょう。」

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
JSP
JSPの基本タグ一覧と使い方まとめ!実務で使えるタグを紹介
No.4
Java&Spring記事人気No4
Java
JavaのIOExceptionクラス徹底解説!初心者向けファイル入出力エラー対策ガイド
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」の使い方を完全ガイド!初心者向け解説