カテゴリ: SpringのDB操作 更新日: 2026/01/01

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

JPQLのGROUP BYの使い方や活用方法
JPQLのGROUP BYの使い方や活用方法

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

新人

「先輩、SpringのプロジェクトでJPQLを使うときにGROUP BYってよく聞くんですけど、どんな役割があるんですか?」

先輩

「お、JPQLのGROUP BYは、データをグループ化して集計するために使うんだ。たとえば、売上データを日付ごとにまとめたいときに便利だよ。」

新人

「なるほど。集計するための句なんですね。具体的にはどんなふうに書くんですか?」

先輩

「それじゃあ、まずはJPQLの基本から見ていこう!」

1. JPQLとは?

1. JPQLとは?
1. JPQLとは?

JPQLとは、Java Persistence Query Languageの略で、Javaでデータベース操作を行うときに使うクエリ言語です。JPQLはSQLに似ていますが、エンティティを操作するために特化されています。Springのプロジェクトでは、@Controllerを使って画面遷移を管理し、JPQLを使ってデータベースから必要な情報を取得します。

JPQLを使うことで、テーブルの構造ではなくエンティティクラスに基づいてデータを操作できます。たとえば、エンティティクラスSalesがあれば、SELECT s FROM Sales sのように書きます。

2. JPQLのGROUP BY句の役割と基本的な書き方

2. JPQLのGROUP BY句の役割と基本的な書き方
2. JPQLのGROUP BY句の役割と基本的な書き方

JPQLのGROUP BY句は、同じ値を持つデータを1つのグループにまとめて集計するために使います。たとえば、売上データを日付ごとに集計したり、商品のカテゴリごとに合計を出したりするときに便利です。

基本的な書き方は次のとおりです。まず、JPQLの構文を見てみましょう。


String jpql = "SELECT s.category, SUM(s.amount) FROM Sales s GROUP BY s.category";
List<Object[]> result = entityManager.createQuery(jpql).getResultList();
for (Object[] row : result) {
    System.out.println("カテゴリ: " + row[0] + ", 合計金額: " + row[1]);
}

この例では、Salesエンティティからcategoryごとの合計金額を取得しています。GROUP BY句を使うことで、同じカテゴリのデータをまとめて合計を出すことができます。

もう少し詳しく、Springの@ControllerクラスでJPQLのGROUP BYを活用する例を見てみましょう。


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("/sales-summary")
    @Transactional
    public String getSalesSummary(Model model) {
        String jpql = "SELECT s.category, SUM(s.amount) FROM Sales s GROUP BY s.category";
        List<Object[]> results = entityManager.createQuery(jpql).getResultList();
        model.addAttribute("salesSummary", results);
        return "salesSummary";
    }
}

このように、Springの@ControllerクラスでJPQLを使い、売上データをカテゴリごとにまとめて取得することができます。Modelに結果を渡すことで、ビュー(salesSummary.htmlなど)で集計結果を表示できます。

実際にビュー側でデータを表示する例も見ておきましょう。


<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>売上集計結果</title>
</head>
<body>
    <h1>売上集計結果</h1>
    <table border="1">
        <tr>
            <th>カテゴリ</th>
            <th>合計金額</th>
        </tr>
        <tr th:each="row : ${salesSummary}">
            <td th:text="${row[0]}"></td>
            <td th:text="${row[1]}"></td>
        </tr>
    </table>
</body>
</html>

このように、JPQLのGROUP BYを活用することで、集計データをわかりやすく表示できます。

JPQLのGROUP BYは非常に便利な機能です。初心者でも理解しやすいので、ぜひSpringの@Controllerクラスで活用してみてください。

3. JPQLのGROUP BY句で使える集計関数

3. JPQLのGROUP BY句で使える集計関数
3. JPQLのGROUP BY句で使える集計関数

JPQLのGROUP BY句と一緒に使える集計関数はいくつかあります。代表的なものはCOUNTSUMAVGMINMAXなどです。これらの集計関数を使うことで、データをグループごとにまとめて数えたり、合計や平均を出したりすることができます。

たとえば、売上データの件数をカテゴリごとに数えたい場合は、COUNT関数を使います。合計金額を求めたい場合は、SUMを使うなど、目的に応じて関数を使い分けましょう。

4. JPQLのGROUP BY句を使うときの具体的な使い方

4. JPQLのGROUP BY句を使うときの具体的な使い方
4. JPQLのGROUP BY句を使うときの具体的な使い方

JPQLのGROUP BY句を使うときは、集計関数と一緒にSELECT句に指定する項目を決める必要があります。たとえば、売上データをカテゴリごとに件数を出したい場合、JPQLは次のように書きます。


String jpql = "SELECT s.category, COUNT(s) FROM Sales s GROUP BY s.category";
List<Object[]> result = entityManager.createQuery(jpql).getResultList();

このクエリでは、Salesエンティティのcategoryごとに、売上データの件数を数えています。COUNT(s)の部分が集計関数として件数を出す役割を担います。

一方で、日付ごとに合計金額を出したい場合は、SUM関数を使います。次の例を見てみましょう。


String jpql = "SELECT s.date, SUM(s.amount) FROM Sales s GROUP BY s.date";
List<Object[]> result = entityManager.createQuery(jpql).getResultList();

このように、JPQLのGROUP BYではSELECT句に指定する項目は、GROUP BYに指定した項目に合わせて決めます。グループ化する項目以外は、必ず集計関数を使わなければならない点に注意しましょう。

JPQLのGROUP BYを使うことで、売上データや社員データなど、さまざまなデータをグループ化して集計できるので、データ分析にとても役立ちます。

5. JPQLのGROUP BY句を使った簡単なサンプルコード

5. JPQLのGROUP BY句を使った簡単なサンプルコード
5. JPQLのGROUP BY句を使った簡単なサンプルコード

ここでは、Springの@Controllerクラスで、JPQLのGROUP BYを使ったサンプルコードを紹介します。売上データを日付ごとに合計金額を出す例です。


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("/sales-daily-summary")
    @Transactional
    public String getDailySalesSummary(Model model) {
        String jpql = "SELECT s.date, SUM(s.amount) FROM Sales s GROUP BY s.date ORDER BY s.date";
        List<Object[]> summary = entityManager.createQuery(jpql).getResultList();
        model.addAttribute("dailySummary", summary);
        return "dailySummary";
    }
}

このサンプルでは、Salesエンティティのdateごとに売上金額を合計し、日付順に並べて結果を取得しています。そしてModelに渡して、ビュー側で表示できるようにしています。

ビュー側のサンプルHTMLも見ておきましょう。


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

このように、JPQLのGROUP BYを使うことで、データをグループ化して集計し、わかりやすく画面に表示できます。初心者の方でも、Springの@Controllerクラスで簡単に使えるので、ぜひ試してみてください。

JPQLのGROUP BYは、データ分析や集計に欠かせない便利な機能です。Pleiadesの環境でGradleを使って開発する場合でも、設定は簡単です。Pleiadesでプロジェクトを作成するときに、Spring関連の依存関係をチェックしておけば、すぐにJPQLを活用できます。

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

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

JPQLのGROUP BY句を使うときには、いくつかの注意点があります。まず、SELECT句に指定する項目は、GROUP BYに指定した項目か、集計関数を使ったものに限定される点に注意しましょう。つまり、グループ化されていない項目をSELECTに書くと、JPQLのエラーになります。

たとえば、次のようなクエリは間違いです。


String jpql = "SELECT s.category, s.date FROM Sales s GROUP BY s.category";

この例では、categoryだけでグループ化しているのに、dateSELECTに指定してしまっています。正しくは、dateではなく集計関数を使うか、GROUP BYdateも追加する必要があります。

また、GROUP BYを使うときは、必要に応じてHAVING句を使って条件を絞り込むこともできます。HAVINGは、グループ化された結果に条件をつけるために使います。

たとえば、合計金額が1000円以上のグループだけを取得する場合、次のように書きます。


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

このように、GROUP BYHAVINGを組み合わせることで、集計結果に対してさらに条件を絞り込むことができます。初心者の方は、GROUP BYSELECTの関係や、HAVINGの役割をしっかり覚えておきましょう。

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

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

JPQLのGROUP BYを使ってデータをグループ化した結果は、List<Object[]>として取得できます。Object[]の配列には、SELECT句で指定した項目が順番に入ります。たとえば、カテゴリと合計金額を取得した場合、row[0]がカテゴリ、row[1]が合計金額になります。

Springの@Controllerクラスでは、こうして取得した結果をModelに渡すことで、ビューで簡単に表示できます。ビュー側では、Thymeleafなどを使ってth:eachで繰り返し表示すると便利です。

例えば、売上集計結果を表示するHTMLは次のように書けます。


<table border="1">
    <tr>
        <th>カテゴリ</th>
        <th>合計金額</th>
    </tr>
    <tr th:each="row : ${salesSummary}">
        <td th:text="${row[0]}"></td>
        <td th:text="${row[1]}"></td>
    </tr>
</table>

このように、JPQLのGROUP BYで取得した結果は、Springの仕組みを使って簡単に画面に出力できます。特に初心者の方は、最初はカテゴリ名や合計金額などの順番を確認しながら表示していくとわかりやすいです。

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

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

JPQLのGROUP BY句は、実際に手を動かして試すのが一番です。まずは、Pleiadesをインストールして、GradleでSpringプロジェクトを作成してみましょう。Pleiadesのチェックボックスで必要な依存関係を追加するだけで、すぐにSpringの環境が整います。

Springの@Controllerクラスで、簡単なGROUP BYのクエリを書いて、売上データや社員データなどを集計してみるのがおすすめです。最初はカテゴリ別の集計や日付別の集計から始めると、仕組みが理解しやすくなります。

もし、さらに深く学びたいときは、JPQLの公式ドキュメントやSpring Data JPAのドキュメントを読むのも良いでしょう。具体的な使い方や構文を知ることで、エラーを減らし、効率的な開発ができるようになります。

さらに、Springの@Controllerクラスだけでなく、@Serviceクラスや@RepositoryクラスでJPQLを使う例も試してみると、より実践的な力が身につきます。初心者の方でも、まずは基本的なGROUP BYの書き方から慣れていくのがおすすめです。

JPQLのGROUP BYをマスターすると、データの集計や分析がグッと楽になります。Pleiadesの環境でGradleプロジェクトを活用して、ぜひいろいろなパターンで試してみてください。そうすれば、JPQLのGROUP BYをもっと深く理解できるはずです。

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

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

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

JPQLとは何ですか?SQLとの違いは何でしょうか?

JPQL(Java Persistence Query Language)は、Javaのエンティティを対象にデータベース操作を行うための言語です。SQLはテーブルベースで操作しますが、JPQLはエンティティベースで操作するのが特徴です。Springのプロジェクトでは、JPQLを使って柔軟にデータ取得が可能になります。
コメント
コメント投稿は、ログインしてください

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

カテゴリの一覧へ
新着記事
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)を完全解説!初心者でもわかるセッションの仕組み