1.1 HQL の概要

前回は Hibernate について説明しましたが、今回はHQL (別名Hibernate Query Language)について紹介します。実際、これは Hibernate でクエリを作成するために変換された SQL です。いくつかの重要な違いがあります。

  1. テーブル名の代わりにクラス名を使用します。
  2. テーブルの列名の代わりにクラスのフィールド名を使用します。
  3. オプションでselect を使用します。

Hibernate に、データベース内にあるすべてのユーザーを返すように依頼しましょう。そのリクエストは次のようになります。

from User

以上です。比較のために、SQL で同様のクエリを示します。

select * from user

これはUserクラスの名前であり、 はuserテーブルの名前です。

完全な Java コードは次のようになります。


public List<User> getAllUsers() {
    try (Session session = sessionFactory.openSession()) {
            return session.createQuery("from User", User.class).list();
    }
}

それ以外の点では、HQL は SQL と非常に似ており、演算子もあります。

  • WHERE
  • ORDER BY
  • GROUP BY
  • HAVING

1.2 HQL の使用例

おそらく、前の例はテーブル名とフィールド名が同じであるため、少しわかりにくいかもしれません。これをより簡単にする特別な例を考えてみましょう。

次のフィールドを含むuser_dataテーブルがあるとします。

  • ID INT
  • ユーザー名VARCHAR(100)
  • ユーザーレベルのINT
  • user_created DATE

このテーブルにマップする Java クラスを作成します。


@Entity
@Table(name="user_data")
class User {
   @Id
   @GeneratedValue
   public Integer id;
 
   @Column(name="user_name")
   public String name;
 
   @Column(name="user_level")
   public Integer level;
 
   @Column(name="user_created")
   public Date created;
}

では、いくつかの例を書いてみましょう。

本社 SQL
ユーザーから select * from user_data
id=3 のユーザーから select * from user_data where id=3
レベルが (10,20,30) のユーザーから select * from user_data where user_level IN (10, 20, 30)
作成されたascによるユーザー順から select * from user_data order by user_created asc
「test」のような名前のユーザーから select * from user_data where user_name like 'test'

クエリは非常に似ており、クラス名とそのフィールドを理解していれば、HQL クエリを読むのは SQL クエリを読むのと同じくらい簡単です。書くのは少し難しいかもしれませんが、非常に複雑なクエリが HQL で書かれることはほとんどありません。

1.3 選択の使用

selectHQLでは、結果のデータ型が で指定した型と一致しない場合に使用できますfrom

たとえば、user_dataテーブルにあるすべてのユーザーの名前を取得したい場合は、次のクエリを記述する必要があります。

select name from User

また、名前に重複がある場合は、演算子を使用できますDISTINCT

select distinct name from User

エイリアスは SQL と同じように機能します。

select distinct u.name from User u where u.created > '2020-01-01'

完全に Java コードの形式では、このリクエストは次のようになります。

public List<String> getUserNames() {
    try (Session session = sessionFactory.openSession()) {
            String hql = "select distinct u.name from User u where u.created > '2020-01-01'";
            Query<String> query = session.createQuery(hql , String.class);
            return query.list();
    }
}

クエリは名前のリストを返す必要があることに注意してください。名前は String 型であるため、関数の型と Query クラスの型パラメーターは両方とも String 型です。