CodeGym /コース /All lectures for JA purposes /HQL でクエリを作成する方法を学ぶ

HQL でクエリを作成する方法を学ぶ

All lectures for JA purposes
レベル 1, レッスン 829
使用可能

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 型です。

コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION