1. 概要

Hibernate集計関数は、指定されたクエリ条件を満たすすべてのオブジェクトのプロパティ値を使用して最終結果を計算します。

Hibernateクエリ言語(HQL)は、 SELECT ステートメントのmin()、max()、sum()、avg()、およびcount()などのさまざまな集計関数をサポートします。 他のSQLキーワードと同様に、これらの関数の使用法では大文字と小文字は区別されません。

このクイックチュートリアルでは、それらの使用方法について説明します。 以下の例では、プリミティブ型またはラッパー型のいずれかを使用して、集計関数の結果を格納していることに注意してください。 HQLは両方をサポートしているため、どちらを使用するかを選択する必要があります。

2. 初期設定

Studentエンティティを定義することから始めましょう。

@Entity
public class Student {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    private long studentId;

    private String name;

    private int age;

    // constructor, getters and setters
}

そして、私たちのデータベースに何人かの学生を投入します:

public class AggregateFunctionsIntegrationTest {

    private static Session session;
    private static Transaction transaction;

    @BeforeClass
    public static final void setup() throws HibernateException, IOException {
        session = HibernateUtil.getSessionFactory()
          .openSession();
        transaction = session.beginTransaction();

        session.save(new Student("Jonas", 22, 12f));
        session.save(new Student("Sally", 20, 34f));
        session.save(new Student("Simon", 25, 45f));
        session.save(new Student("Raven", 21, 43f));
        session.save(new Student("Sam", 23, 33f));

    }

}

studentId フィールドは、SEQUENCE生成戦略を使用して入力されていることに注意してください。

これについては、 Hibernate Identifier GenerationStrategiesのチュートリアルで詳しく知ることができます。

3. min()

ここで、Studentテーブルに格納されているすべての学生の中から最低年齢を見つけたいとします。 min()関数を使用すると、簡単に実行できます。

@Test
public void whenMinAge_ThenReturnValue() {
    int minAge = (int) session.createQuery("SELECT min(age) from Student")
      .getSingleResult();
    assertThat(minAge).isEqualTo(20);
}

The getSingleResult()メソッドはオブジェクトタイプを返します。 そのため、出力をダウンキャストしました int

4. max()

min()関数と同様に、 max()関数があります。

@Test
public void whenMaxAge_ThenReturnValue() {
    int maxAge = (int) session.createQuery("SELECT max(age) from Student")
      .getSingleResult();
    assertThat(maxAge).isEqualTo(25);
}

ここでも、結果はintタイプにダウンキャストされます。

min()およびmax()関数の戻りタイプは、コンテキストのフィールドによって異なります。 Student’sageintタイプの属性であるため、整数を返します。

5. sum()

sum()関数を使用して、すべての年齢の合計を見つけることができます。

@Test
public void whenSumOfAllAges_ThenReturnValue() {
    Long sumOfAllAges = (Long) session.createQuery("SELECT sum(age) from Student")
      .getSingleResult();
    assertThat(sumOfAllAges).isEqualTo(111);
}

フィールドのデータ型に応じて、 sum()関数はLongまたはDoubleのいずれかを返します。

6. avg()

同様に、 avg()関数を使用して、平均年齢を見つけることができます。

@Test
public void whenAverageAge_ThenReturnValue() {
    Double avgAge = (Double) session.createQuery("SELECT avg(age) from Student")
      .getSingleResult();
    assertThat(avgAge).isEqualTo(22.2);
}

avg()関数は、常にDouble値を返します。

7. count()

ネイティブSQLと同様に、HQLは count()関数も提供します。 Studentテーブルのレコード数を調べてみましょう。

@Test
public void whenCountAll_ThenReturnValue() {
    Long totalStudents = (Long) session.createQuery("SELECT count(*) from Student")
      .getSingleResult();
    assertThat(totalStudents).isEqualTo(5);
}

count()関数は、Longタイプを返します。

count()関数の利用可能なバリエーションのいずれかを使用できます– count(*)、count(…)、 count(distinct…)、または count(all…)それらのそれぞれは、そのネイティブSQLの対応物と意味的に同等です。

8. 結論

このチュートリアルでは、Hibernateで使用できる集計関数のタイプについて簡単に説明しました。 Hibernate集計関数は、昔ながらのSQLで使用できるものと似ています。

いつものように、完全なソースコードはGitHubから入手できます。