Hibernate-クエリ言語

Hibernateクエリ言語(HQL)は、SQLに似たオブジェクト指向のクエリ言語ですが、テーブルと列を操作する代わりに、永続オブジェクトとそのプロパティを操作します。HQLクエリはHibernateによって従来のSQLクエリに変換され、データベースでアクションを実行します。

ネイティブSQLを使用してHibernateでSQLステートメントを直接使用できますが、データベースの移植性の煩わしさを回避し、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();

ORDERBY句

HQLクエリの結果を並べ替えるには、 ORDER BY句。結果は、結果セット内のオブジェクトの任意のプロパティで昇順(ASC)または降順(DESC)のいずれかで並べ替えることができます。以下は、ORDERBY句を使用する簡単な構文です。

String hql = "FROM Employee E WHERE E.id > 10 ORDER BY E.salary DESC";
Query query = session.createQuery(hql);
List results = query.list();

複数のプロパティで並べ替える場合は、次のようにカンマで区切って、orderby句の最後に追加のプロパティを追加するだけです。

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();

GROUPBY句

この句を使用すると、Hibernateはデータベースから情報を取得し、属性の値に基づいて情報をグループ化し、通常、結果を使用して集計値を含めることができます。以下は、GROUPBY句を使用する簡単な構文です。

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();

更新条項

一括更新はHibernate3を使用するHQLの新機能であり、Hibernate3ではHibernate2とは異なる方法で削除が機能します。クエリインターフェイスに、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あるオブジェクトから別のオブジェクトにレコードを挿入できる場合にのみ句。以下は、INSERTINTO句を使用する簡単な構文です。

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と同様に、さまざまな集計メソッドをサポートしています。これらはHQLでもSQLと同じように機能し、使用可能な関数のリストは次のとおりです。

シニア番号 機能と説明
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();

クエリを使用したページ付け

ページネーションのためのクエリインターフェイスには2つの方法があります。

シニア番号 方法と説明
1

Query setFirstResult(int startPosition)

このメソッドは、行0から始まる、結果セットの最初の行を表す整数を取ります。

2

Query setMaxResults(int maxResult)

このメソッドは、Hibernateに固定数を取得するように指示します maxResults オブジェクトの。

上記の2つの方法を一緒に使用すると、WebまたはSwingアプリケーションでページングコンポーネントを構築できます。以下は、一度に10行をフェッチするように拡張できる例です。

String hql = "FROM Employee";
Query query = session.createQuery(hql);
query.setFirstResult(1);
query.setMaxResults(10);
List results = query.list();