Hibernate集計関数

1. 概要

Hibernate集計関数**-指定されたクエリ条件を満たすすべてのオブジェクトのプロパティ値を使用して、最終結果を計算します。**
Hibernate Query Language(HQL)は、_SELECT_ステートメントでさまざまな集約関数をサポートしています。 他の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_生成戦略を使用して入力されていることに注意してください。
これについては、learnhttps://www.baeldung.com/hibernate-identifiers [Hibernate Identifier Generation Strategies]のチュートリアルで詳細を学ぶことができます。

3. min()

ここで、_Student_テーブルに保存されているすべての学生の中から最低年齢を見つけたいとします。 _min()_関数を使用して簡単に実行できます。
@Test
public void whenMinAge_ThenReturnValue() {
    int minAge = (int) session.createQuery("SELECT min(age) from Student")
      .getSingleResult();
    assertThat(minAge).isEqualTo(20);
}
  • _getSingleResult()_メソッドは_Object_型を返します。*したがって、出力を_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のage_は_int_型の属性であるため、整数を返します。

5. 和()

_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. カウント()

ネイティブ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で使用可能な関数に似ています。
いつものように、完全なソースコードはhttps://github.com/eugenp/tutorials/tree/master/persistence-modules/hibernate5[Github上]で入手できます。