カテゴリ: SpringのDB操作 更新日: 2025/12/17

JPQLのHAVING句(GROUP BY)の使い方や活用方法を初心者向けに解説!

JPQLのHAVING句(GROUP BY)の使い方や活用方法
JPQLのHAVING句(GROUP BY)の使い方や活用方法

新人と先輩の会話形式で理解しよう

新人

「先輩、JPQLで集計したデータに条件を付けたいときはどうすればいいんですか?」

先輩

「それなら、HAVING句を使うといいよ。GROUP BYでグループ化した後の集計結果に条件を付けることができるんだ。」

新人

WHERE句とはどう違うんですか?」

先輩

「いい質問だね。WHERE句はグループ化する前のデータに条件を付けるのに対して、HAVING句はグループ化した後の集計結果に条件を付けるんだ。具体的な使い方を見てみよう!」

1. JPQLのHAVING句とは?

1. JPQLのHAVING句とは?
1. JPQLのHAVING句とは?

HAVING句は、JPQLでGROUP BY句を使ってグループ化した後の集計結果に対して条件を指定するための句です。たとえば、売上データを商品カテゴリごとに集計し、合計金額が一定以上のカテゴリだけを抽出したい場合に使用します。

基本的な構文は以下のとおりです。


String jpql = "SELECT s.category, SUM(s.amount) FROM Sales s GROUP BY s.category HAVING SUM(s.amount) > 100000";

このクエリでは、Salesエンティティのcategoryごとにamountを合計し、その合計が100,000を超えるカテゴリのみを抽出しています。

2. JPQLのGROUP BY句との関係と基本的な書き方

2. JPQLのGROUP BY句との関係と基本的な書き方
2. JPQLのGROUP BY句との関係と基本的な書き方

GROUP BY句は、指定したカラムの値ごとにデータをグループ化するための句です。HAVING句は、このGROUP BYでグループ化された各グループの集計結果に対して条件を指定するために使用されます。

たとえば、売上データを日付ごとにグループ化し、売上件数が10件以上の日付だけを抽出したい場合、以下のように記述します。


String jpql = "SELECT s.date, COUNT(s) FROM Sales s GROUP BY s.date HAVING COUNT(s) >= 10";

このクエリでは、Salesエンティティのdateごとに売上件数をカウントし、その件数が10以上の日付のみを抽出しています。

Springの@Controllerクラスでの実装例を見てみましょう。


package com.example.demo.controller;

import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceContext;
import jakarta.transaction.Transactional;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

import java.util.List;

@Controller
public class SalesController {

    @PersistenceContext
    private EntityManager entityManager;

    @GetMapping("/high-sales-categories")
    @Transactional
    public String getHighSalesCategories(Model model) {
        String jpql = "SELECT s.category, SUM(s.amount) FROM Sales s GROUP BY s.category HAVING SUM(s.amount) > 100000";
        List<Object[]> results = entityManager.createQuery(jpql).getResultList();
        model.addAttribute("highSalesCategories", results);
        return "highSalesCategories";
    }
}

このように、JPQLのGROUP BY句とHAVING句を組み合わせることで、集計結果に対して柔軟な条件指定が可能になります。

3. JPQLのHAVING句の役割と書き方

3. JPQLのHAVING句の役割と書き方
3. JPQLのHAVING句の役割と書き方

JPQLのHAVING句は、集計結果に対して条件を設定するときに使います。例えば、売上データをカテゴリごとに合計して、その合計が特定の金額以上のカテゴリだけを抽出したい場合などに便利です。WHERE句では、集計する前のレコードに対する条件しか指定できませんが、HAVING句は集計結果に対する条件を指定できるのが特徴です。

基本的な構文としては、GROUP BY句の後にHAVING句を続けて記述します。HAVING句には、SUMCOUNTなどの集計関数を使うことが多いです。例えば、次のように書けます。


String jpql = "SELECT s.category, SUM(s.amount) FROM Sales s GROUP BY s.category HAVING SUM(s.amount) > 100000";

この例では、売上データをカテゴリごとに合計し、その合計が10万円を超えるカテゴリだけを取得しています。初心者の方は、HAVING句の基本的な役割をまずは理解しておきましょう。

4. JPQLのHAVING句を使った具体的な集計条件の設定

4. JPQLのHAVING句を使った具体的な集計条件の設定
4. JPQLのHAVING句を使った具体的な集計条件の設定

JPQLのHAVING句は、様々な集計条件を柔軟に設定できます。例えば、売上件数が多いカテゴリだけを抽出する場合は、COUNT関数を使います。次のように書けます。


String jpql = "SELECT s.category, COUNT(s) FROM Sales s GROUP BY s.category HAVING COUNT(s) >= 50";

このクエリは、売上件数が50件以上のカテゴリだけを抽出しています。このように、HAVING句ではCOUNTSUMAVGなどの集計関数を使って条件を設定できます。

さらに、売上金額の平均が高いカテゴリを知りたい場合はAVG関数を使います。


String jpql = "SELECT s.category, AVG(s.amount) FROM Sales s GROUP BY s.category HAVING AVG(s.amount) > 5000";

この例では、売上金額の平均が5000円を超えるカテゴリを抽出しています。HAVING句はこうした条件をまとめて指定できるので、非常に便利です。

5. JPQLのHAVING句を使った集計クエリのサンプルコード

5. JPQLのHAVING句を使った集計クエリのサンプルコード
5. JPQLのHAVING句を使った集計クエリのサンプルコード

ここでは、Springの@ControllerクラスでHAVING句を使った集計クエリのサンプルコードを紹介します。売上件数が30件以上の日付ごとの売上合計を抽出する例です。


package com.example.demo.controller;

import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceContext;
import jakarta.transaction.Transactional;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

import java.util.List;

@Controller
public class SalesSummaryController {

    @PersistenceContext
    private EntityManager entityManager;

    @GetMapping("/daily-high-sales")
    @Transactional
    public String getDailyHighSales(Model model) {
        String jpql = "SELECT s.date, SUM(s.amount) FROM Sales s GROUP BY s.date HAVING COUNT(s) >= 30";
        List<Object[]> results = entityManager.createQuery(jpql).getResultList();
        model.addAttribute("dailyHighSales", results);
        return "dailyHighSales";
    }
}

このサンプルでは、売上データを日付ごとにグループ化し、売上件数が30件以上の日付だけを取得しています。取得したデータはModelに渡され、ビューで表示できるようになります。

ビュー側のHTMLも簡単に見ておきましょう。


<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>日別売上集計結果</title>
</head>
<body>
    <h1>日別売上集計結果</h1>
    <table border="1">
        <tr>
            <th>日付</th>
            <th>合計金額</th>
        </tr>
        <tr th:each="row : ${dailyHighSales}">
            <td th:text="${row[0]}"></td>
            <td th:text="${row[1]}"></td>
        </tr>
    </table>
</body>
</html>

このように、JPQLのHAVING句を使うと、集計条件を細かく指定しながらデータを集計できます。初心者の方でも、PleiadesでSpringの環境を整えて、このサンプルを試してみると理解が深まります。

JPQLのHAVING句は、データ分析や集計結果の条件抽出に非常に便利な機能です。まずは基本的な例から試してみて、少しずつ応用に挑戦してみましょう。

6. JPQLのHAVING句を使うときの注意点

6. JPQLのHAVING句を使うときの注意点
6. JPQLのHAVING句を使うときの注意点

JPQLのHAVING句を使うときには、いくつか注意しておきたいポイントがあります。まず、HAVING句はGROUP BY句があるときにしか使えない点です。HAVINGはグループ化された集計結果に対する条件を指定するため、GROUP BY句なしでは意味を持ちません。

また、HAVING句で指定する条件は、集計関数を使うことが一般的です。COUNTSUMAVGなどの集計関数と一緒に使うことで、グループ化されたデータに対する絞り込みができます。間違って、集計関数を使わずにHAVING句で条件を指定してしまうと、エラーが出ることがあるので気をつけましょう。

さらに、JPQLではHAVING句とWHERE句の使い分けが大切です。WHERE句はグループ化前のデータに条件を付け、HAVING句はグループ化後の集計結果に条件を付けます。これを理解しておくと、より正確にJPQLを活用できます。

7. JPQLのHAVING句を使った検索結果の表示例

7. JPQLのHAVING句を使った検索結果の表示例
7. JPQLのHAVING句を使った検索結果の表示例

JPQLのHAVING句で抽出した集計結果は、Springの@ControllerクラスでModelに渡して、ビューで表示するのが一般的です。たとえば、カテゴリごとの売上合計が10万円を超える場合のみを表示するビューの例を見てみましょう。


<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>カテゴリ別売上集計</title>
</head>
<body>
    <h1>カテゴリ別売上集計(10万円以上)</h1>
    <table border="1">
        <tr>
            <th>カテゴリ</th>
            <th>合計金額</th>
        </tr>
        <tr th:each="row : ${highSalesCategories}">
            <td th:text="${row[0]}"></td>
            <td th:text="${row[1]}"></td>
        </tr>
    </table>
</body>
</html>

このように、HAVING句を使って取得した結果は、ビューに渡すだけで簡単に画面表示ができます。カテゴリ名や売上合計など、必要な情報がそれぞれの列に表示されるようにth:eachth:textを使うことで、見やすく整った出力が可能です。

8. JPQLのHAVING句を学ぶおすすめの方法

8. JPQLのHAVING句を学ぶおすすめの方法
8. JPQLのHAVING句を学ぶおすすめの方法

JPQLのHAVING句をマスターするには、まず自分の手で書いて動かしてみるのが一番です。Pleiadesをインストールして、GradleでSpringのプロジェクトを作成し、@ControllerクラスでJPQLを使ったサンプルを書いてみましょう。

実際にGROUP BYHAVINGを使ったクエリをいくつか試してみると、それぞれの動きや違いが理解しやすくなります。特に、条件を少しずつ変えながら結果を確認するのが効果的です。SUMCOUNTだけでなく、AVGMAXなども組み合わせて試すと、さらに理解が深まるでしょう。

もし余裕があれば、Spring Data JPAのリポジトリを使って@QueryアノテーションでJPQLを書いてみるのもおすすめです。@Controllerクラスで書くのとはまた違った書き方が学べて、より幅広い実装ができるようになります。

初心者の方でも、Pleiadesを活用すれば、JPQLのHAVING句を簡単に学び、実践に活かすことができます。少しずつ練習を重ねて、データ分析や集計に役立てていきましょう!

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

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

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

JPQLのHAVING句とは何ですか?

JPQLのHAVING句とは、GROUP BYでグループ化した後の集計結果に対して条件を付けるための句です。例えば、売上合計が一定額を超えるカテゴリだけを抽出する場合に使います。
コメント
コメント投稿は、ログインしてください

まだ口コミはありません。

カテゴリの一覧へ
新着記事
New1
Spring認証(Spring Security)
Spring BootでCORSを設定する方法を完全解説!初心者でもわかるセキュリティ対策
New2
Spring認証(Spring Security)
パスワードをハッシュ化する理由とは?セキュリティ対策の基本をSpring Securityで学ぼう
New3
SpringのWeb開発(Spring MVC)
HTTPリクエストとレスポンスの基本を完全解説!Spring MVC初心者がWeb通信の仕組みをやさしく理解
New4
Spring認証(Spring Security)
ブラウザからのフォーム送信とは?HTTPリクエストの基礎を初心者向けに解説!
人気記事
No.1
Java&Spring記事人気No1
SpringのWeb開発(Spring MVC)
ルーティングとは?基本概念(Spring MVCのURL制御を理解)
No.2
Java&Spring記事人気No2
Thymeleaf
Thymeleaf とは?初心者向けにThymeleafの基本を徹底解説
No.3
Java&Spring記事人気No3
Springの基本
application.properties と YAML の基本をやさしく解説!初心者向けSpring Boot設定ファイル入門
No.4
Java&Spring記事人気No4
Springの基本
Spring Bootのデフォルトログ設定を徹底解説(Logback / SLF4J)
No.5
Java&Spring記事人気No5
Springの基本
Spring Bootの環境変数の設定方法をやさしく解説!初心者向けapplication.propertiesの使い方
No.6
Java&Spring記事人気No6
SpringのWeb開発(Spring MVC)
ループ処理(th:each)の基本を完全ガイド!Thymeafの繰り返し処理の使い方
No.7
Java&Spring記事人気No7
SpringのDB操作
JPAの標準クエリメソッド(findById, findAll)を完全解説!初心者でもわかるデータ取得の基本
No.8
Java&Spring記事人気No8
Spring認証(Spring Security)
セッション管理の基本(@SessionAttributes)を完全解説!初心者でもわかるセッションの仕組み