Hibernate-query-language
Hibernate-クエリ言語
Hibernate Query Language(HQL)はSQLに似たオブジェクト指向のクエリ言語ですが、HQLはテーブルと列を操作する代わりに、永続オブジェクトとそのプロパティを操作します。 HQLクエリは、Hibernateによって従来のSQLクエリに変換され、データベースでアクションを実行します。
ネイティブSQLを使用してSQLステートメントをHibernateで直接使用できますが、データベースの移植性の面倒を避け、HibernateのSQL生成およびキャッシュ戦略を活用するために、可能な限りHQLを使用することをお勧めします。
SELECT、FROM、WHEREなどのキーワードでは大文字と小文字は区別されませんが、HQLではテーブル名や列名などのプロパティでは大文字と小文字が区別されます。
FROM句
完全な永続オブジェクトをメモリにロードする場合は、 FROM 句を使用します。 以下は、FROM句を使用する簡単な構文です-
String hql = "FROM Employee";
Query query = session.createQuery(hql);
List results = query.list();
HQLでクラス名を完全に修飾する必要がある場合は、次のようにパッケージとクラス名を指定するだけです-
String hql = "FROM com.hibernatebook.criteria.Employee";
Query query = session.createQuery(hql);
List results = query.list();
AS句
特に長いクエリがある場合、 AS 句を使用して、HQLクエリのクラスにエイリアスを割り当てることができます。 たとえば、前の単純な例は次のようになります-
String hql = "FROM Employee AS E";
Query query = session.createQuery(hql);
List results = query.list();
*AS* キーワードはオプションであり、次のようにクラス名の直後にエイリアスを指定することもできます-
String hql = "FROM Employee E";
Query query = session.createQuery(hql);
List results = query.list();
SELECT句
*SELECT* 句を使用すると、from句よりも結果セットをより詳細に制御できます。 オブジェクト全体ではなくオブジェクトのプロパティをほとんど取得しない場合は、SELECT句を使用します。 以下は、SELECT句を使用してEmployeeオブジェクトのfirst_nameフィールドのみを取得する簡単な構文です-
String hql = "SELECT E.firstName FROM Employee E";
Query query = session.createQuery(hql);
List results = query.list();
ここで注目すべきは、 Employee.firstName がEMPLOYEEテーブルのフィールドではなく、Employeeオブジェクトのプロパティであることです。
WHERE句
ストレージから返される特定のオブジェクトを絞り込む場合は、WHERE句を使用します。 以下は、WHERE句を使用する簡単な構文です-
String hql = "FROM Employee E WHERE E.id = 10";
Query query = session.createQuery(hql);
List results = query.list();
ORDER BY句
HQLクエリの結果を並べ替えるには、 ORDER BY 句を使用する必要があります。 結果セット内のオブジェクトのプロパティごとに、昇順(ASC)または降順(DESC)で結果を並べ替えることができます。 以下は、ORDER BY句を使用する簡単な構文です-
String hql = "FROM Employee E WHERE E.id > 10 ORDER BY E.salary DESC";
Query query = session.createQuery(hql);
List results = query.list();
あなたが複数のプロパティでソートしたい場合は、次のようにコンマで区切られた追加のプロパティをorder by句の最後に追加するだけです-
String hql = "FROM Employee E WHERE E.id > 10 " +
"ORDER BY E.firstName DESC, E.salary DESC ";
Query query = session.createQuery(hql);
List results = query.list();
GROUP BY句
この句により、Hibernateはデータベースから情報を取得し、属性の値に基づいてグループ化し、通常は結果を使用して集計値を含めます。 GROUP BY句を使用する簡単な構文は次のとおりです-
String hql = "SELECT SUM(E.salary), E.firtName FROM Employee E " +
"GROUP BY E.firstName";
Query query = session.createQuery(hql);
List results = query.list();
名前付きパラメーターの使用
Hibernateは、HQLクエリで名前付きパラメーターをサポートします。 これにより、ユーザーからの入力を受け入れるHQLクエリを簡単に作成でき、SQLインジェクション攻撃から保護する必要はありません。 以下は、名前付きパラメータを使用する簡単な構文です-
String hql = "FROM Employee E WHERE E.id = :employee_id";
Query query = session.createQuery(hql);
query.setParameter("employee_id",10);
List results = query.list();
UPDATE句
一括更新は、Hibernate 3でのHQLの新機能であり、Hibernate 3での削除作業はHibernate 2での削除作業とは異なります。 Queryインターフェースには、HQL UPDATEまたはDELETEステートメントを実行するためのexecuteUpdate()というメソッドが含まれています。
*UPDATE* 句を使用して、1つ以上のオブジェクトの1つ以上のプロパティを更新できます。 以下は、UPDATE句を使用する簡単な構文です-
String hql = "UPDATE Employee set salary = :salary " +
"WHERE id = :employee_id";
Query query = session.createQuery(hql);
query.setParameter("salary", 1000);
query.setParameter("employee_id", 10);
int result = query.executeUpdate();
System.out.println("Rows affected: " + result);
DELETE句
*DELETE* 句を使用して、1つ以上のオブジェクトを削除できます。 以下は、DELETE句を使用する簡単な構文です-
String hql = "DELETE FROM Employee " +
"WHERE id = :employee_id";
Query query = session.createQuery(hql);
query.setParameter("employee_id", 10);
int result = query.executeUpdate();
System.out.println("Rows affected: " + result);
INSERT句
HQLは、あるオブジェクトから別のオブジェクトにレコードを挿入できる場合にのみ、 INSERT INTO 句をサポートします。 以下は、INSERT INTO句を使用する単純な構文です-
String hql = "INSERT INTO Employee(firstName, lastName, salary)" +
"SELECT firstName, lastName, salary FROM old_employee";
Query query = session.createQuery(hql);
int result = query.executeUpdate();
System.out.println("Rows affected: " + result);
集計メソッド
HQLは、SQLと同様に、さまざまな集計メソッドをサポートしています。 それらはSQLと同じようにHQLで機能し、以下は利用可能な関数のリストです-
Sr.No. | Functions & Description |
---|---|
1 |
avg(property name) プロパティの値の平均 |
2 |
count(property name or *) 結果でプロパティが発生する回数 |
3 |
max(property name) プロパティ値の最大値 |
4 |
min(property name) プロパティ値の最小値 |
5 |
sum(property name) プロパティ値の合計 |
*distinct* キーワードは、行セット内の一意の値のみをカウントします。 次のクエリは一意のカウントのみを返します-
String hql = "SELECT count(distinct E.firstName) FROM Employee E";
Query query = session.createQuery(hql);
List results = query.list();
クエリを使用したページネーション
ページ付けのためのQueryインターフェースには2つのメソッドがあります。
Sr.No. | Method & Description |
---|---|
1 |
Query setFirstResult(int startPosition) このメソッドは、結果セットの行0から始まる最初の行を表す整数を受け取ります。 |
2 |
Query setMaxResults(int maxResult) このメソッドは、オブジェクトの固定数 maxResults を取得するようにHibernateに指示します。 |
上記の2つの方法を一緒に使用して、WebアプリケーションまたはSwingアプリケーションでページングコンポーネントを構築できます。 以下は、一度に10行をフェッチするように拡張できる例です-
String hql = "FROM Employee";
Query query = session.createQuery(hql);
query.setFirstResult(1);
query.setMaxResults(10);
List results = query.list();