カテゴリ: Spring 更新日: 2026/05/01

SpringのCriteriaBuilderでdisjunctionメソッドを使った条件付きクエリ作成方法を解説

CriteriaBuilderのdisjunctionメソッド
CriteriaBuilderのdisjunctionメソッド

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

生徒

「Springで、複数の条件のどれにも該当しないデータを簡単に検索する方法はありますか?」

先生

「SpringのCriteriaBuilderクラスにはdisjunctionメソッドがあります。このメソッドを使えば、初期状態で常にfalseの条件を作成でき、動的に条件を追加していくことができます。」

生徒

「具体的にdisjunctionメソッドの使い方を教えてください!」

先生

「それでは、disjunctionメソッドを使ったクエリ作成方法を解説しますね!」

1. CriteriaBuilderとは?

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

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

CriteriaBuilderは、SpringのJPAを使って動的なクエリを作成するためのクラスです。これを利用すると、SQLを直接記述することなく、Javaコードで柔軟なクエリを構築することが可能です。

特に、動的に条件を組み合わせる必要がある場合や、複雑な検索ロジックを求められるシナリオで重宝します。disjunctionメソッドは、初期状態でfalse条件を作成するため、条件を後から追加する場合に便利です。

2. disjunctionメソッドとは?

2. disjunctionメソッドとは?
2. disjunctionメソッドとは?

CriteriaBuilderdisjunctionメソッドは、初期状態でfalseの条件を作成するためのメソッドです。これを利用すると、条件を後から追加する際に柔軟な対応が可能となります。

例えば、「価格が100以下、またはカテゴリが『食品』以外の商品を検索する」といったケースで使用されます。条件が追加されるまではfalseとなり、条件が追加されるとそれらが評価される形になります。

3. 実際のコード例

3. 実際のコード例
3. 実際のコード例

以下は、価格が100以下またはカテゴリが『食品』以外の商品を検索する例です。


import jakarta.persistence.criteria.CriteriaBuilder;
import jakarta.persistence.criteria.CriteriaQuery;
import jakarta.persistence.criteria.Predicate;
import jakarta.persistence.criteria.Root;

import org.springframework.stereotype.Repository;
import org.springframework.beans.factory.annotation.Autowired;

import jakarta.persistence.EntityManager;

@Repository
public class ProductRepository {

    @Autowired
    private EntityManager entityManager;

    public List<Product> findProductsByDynamicConditions(Double maxPrice, String excludedCategory) {
        CriteriaBuilder cb = entityManager.getCriteriaBuilder();
        CriteriaQuery<Product> query = cb.createQuery(Product.class);
        Root<Product> root = query.from(Product.class);

        Predicate predicate = cb.disjunction();

        if (maxPrice != null) {
            predicate = cb.or(predicate, cb.lessThanOrEqualTo(root.get("price"), maxPrice));
        }
        if (excludedCategory != null) {
            predicate = cb.or(predicate, cb.not(cb.equal(root.get("category"), excludedCategory)));
        }

        query.select(root).where(predicate);

        return entityManager.createQuery(query).getResultList();
    }
}

このコードのポイント:

  • disjunctionメソッドを使用して初期状態の条件を作成している点。
  • 条件が動的に追加されるため、柔軟なクエリ作成が可能である点。
  • 動的な検索要件に対応するための効率的なアプローチである点。

4. 実行結果例

「4. 実行結果例」の重要ポイントを、初心者の方にも分かりやすく簡潔に解説します。

4. 実行結果例
4. 実行結果例

データベースに以下のデータがある場合:


ID | 商品名      | 価格  | カテゴリ
1  | 商品A       | 120   | 食品
2  | 商品B       | 90    | 電化製品
3  | 商品C       | 80    | 食品

例えば、「価格が100以下、またはカテゴリが『食品』以外」の商品を検索すると、結果は以下の通りです:


商品B, 商品C

5. 応用:複数条件を組み合わせたdisjunctionメソッドの活用

5. 応用:複数条件を組み合わせたdisjunctionメソッドの活用
5. 応用:複数条件を組み合わせたdisjunctionメソッドの活用

disjunctionメソッドは、他の条件メソッドと組み合わせて柔軟なクエリを作成することが可能です。例えば、「価格が100以下、またはカテゴリが『食品』以外、または在庫が50以上の商品」を検索する場合、以下のように記述します。


query.where(
    cb.or(
        cb.lessThanOrEqualTo(root.get("price"), 100),
        cb.not(cb.equal(root.get("category"), "食品")),
        cb.greaterThanOrEqualTo(root.get("stock"), 50)
    )
);

このように、disjunctionメソッドを使用することで、柔軟なクエリ作成が可能となり、さまざまな要件に対応できます。

6.まとめ

6.まとめ
6.まとめ

この記事では、SpringのCriteriaBuilderクラスを使用したdisjunctionメソッドについて解説しました。このメソッドは、初期状態でfalseの条件を作成し、動的に条件を追加して柔軟なクエリを構築するのに役立ちます。

例えば、「価格が100以下、またはカテゴリが『食品』以外」のような条件を簡単に設定でき、実際のプロジェクトで多様な検索条件を効率的に取り扱うことが可能です。また、他の条件メソッドと組み合わせることで、さらに複雑なクエリも作成できるため、幅広いニーズに応えられる強力なツールです。

以下に、応用例として「価格が100以下、またはカテゴリが『食品』以外、または在庫が50以上の商品」を検索するサンプルコードを掲載します。


query.where(
    cb.or(
        cb.lessThanOrEqualTo(root.get("price"), 100),
        cb.not(cb.equal(root.get("category"), "食品")),
        cb.greaterThanOrEqualTo(root.get("stock"), 50)
    )
);

このように、disjunctionメソッドを活用すれば、複雑な検索条件を簡単に作成し、実際の開発現場で効率的なデータ検索を行うことができます。

先生と生徒の振り返り会話

生徒

disjunctionメソッドを使った条件付きクエリ作成方法がよく分かりました!初期状態をfalseにしておけば、条件を後から追加できるのが便利ですね。」

先生

「そうですね。disjunctionメソッドは、動的なクエリを作る上で非常に柔軟性が高い方法です。他にもandorメソッドと組み合わせると、さらに複雑な条件を簡単に扱えるようになりますよ。」

生徒

「次は、複数条件を組み合わせたクエリを試してみたいと思います!」

先生

「いいですね!実際にコードを書いてみると、理解がさらに深まるはずです。困ったことがあれば、また質問してくださいね。」

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

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

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

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

SpringのCriteriaBuilderとは、具体的にどのような役割を持つクラスなのですか?

Spring Frameworkにおいて、CriteriaBuilderはJPA(Java Persistence API)を使用してデータベース操作を行う際に、プログラムコード(Java)を用いて動的にクエリ(検索命令)を組み立てるための非常に重要なインターフェースです。通常、データベースへの命令はSQLという言語で記述しますが、CriteriaBuilderを利用することで、SQLを直接文字列として記述することなく、タイプセーフに(型安全に)検索条件を構築できるのが大きなメリットです。これにより、開発者はJavaの文法に従って、直感的にデータベース検索のロジックを実装することが可能になります。
カテゴリの一覧へ
新着記事
New1
Java
JavaのNotSerializableExceptionを完全解説!初心者でも理解できるシリアライズと例外処理
新規投稿
New2
Spring
Springの@Repositoryアノテーションの使い方を徹底解説!初心者でもわかるSpringフレームワークのデータアクセス
更新記事
New3
Spring
Springの@Componentアノテーションの使い方を徹底解説!初心者でもわかるSpring Boot入門
更新記事
New4
Java
Javaのjava.mathとBigIntegerのintValueメソッドを完全解説!初心者でもわかる数値変換の基本
更新記事
人気記事
No.1
Java&Spring記事人気No1
Servlet
JavaのHttpSessionを徹底解説!初心者でもわかるセッション管理の基本
No.2
Java&Spring記事人気No2
JSP
JSPの基本タグ一覧と使い方まとめ!実務で使えるタグを紹介
No.3
Java&Spring記事人気No3
JSP
JSPでフォームを表示して入力を受け取る基本手順をやさしく解説!初心者向けフォーム処理の入門ガイド
No.4
Java&Spring記事人気No4
Spring
Springの@Serviceアノテーションの使い方を徹底解説!初心者でもわかるSpring フレームワーク入門
No.5
Java&Spring記事人気No5
JSP
JSPでCSSやJSを読み込む基本!外部ファイルのパス指定に注意しよう
No.6
Java&Spring記事人気No6
Spring
Spring BootとJavaの互換性一覧!3.5/3.4/3.3はJava 21・17に対応してる?
No.7
Java&Spring記事人気No7
Spring
Spring Data JPA入門!findAll()やfindBy**()の使い方などデータベース操作の基礎を学ぶ
No.8
Java&Spring記事人気No8
JSP
JSPでif文・for文を使う方法!初心者でもわかるJavaとの違いと使い方