1.1 HQL の概要
前回は Hibernate について説明しましたが、今回はHQL (別名Hibernate Query Language)について紹介します。実際、これは Hibernate でクエリを作成するために変換された SQL です。いくつかの重要な違いがあります。
- テーブル名の代わりにクラス名を使用します。
- テーブルの列名の代わりにクラスのフィールド名を使用します。
- オプションで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 選択の使用
select
HQLでは、結果のデータ型が で指定した型と一致しない場合に使用できます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 型です。
GO TO FULL VERSION