4.HQL(Hibernate Query Language)の利用
2005.09.28 株式会社四次元データ 瀧下 浩
- 4.1. HQLの考え方
- 4.2. HQL の発行
- 4.3. 名前つきパラメータで条件を指定
- 4.4. 名前つきクエリで条件を指定する
- 4.5. ソート
- 4.6. その他
この章では、Hibernate を利用した「オブジェクトの検索」について詳しく見ていきます。 検索の方法は大きく2つ用意されています。
- クエリを発行する
- クライテリアクエリを構築する
前者は、HQL という SQL ライクなクエリを発行することで、検索条件を指定する方法です。
後者は、検索するオブジェクトが満たすべき条件「クライテリア」をオブジェクトとして追加 していく方法です。前章の BookSelecter
クラスで利用したのは、こちらの方法です。
この章では、HQL を利用してオブジェクトを検索する方法を紹介します。
4.1 HQLの考え方
HQL は SQL ライクなクエリ言語であることは前述の通りです。しかし、HQL と SQL では根本的 な考え方が異なっています。SQL
はリレーショナルデータベースをベースとする考え方ですが、 HQL は、オブジェクトをベースとしてクエリを構築します。
以下の例は、最も簡単な
HQL クエリです。
from com.techscore.hibernate.chapter1.Book
これは、「com.techscore.hibernate.chapter1.Book クラスのオブジェクトを全部」という条件です。
このクエリを発行すると、Hibernate はデータベース上に永続化されている Book オブジェクトを 全て取得して返します。
※データベースに永続化されている Book オブジェクトと言っても、実際には オブジェクトがそのまま格納されているわけではなく、1章の Book
テーブルと Author テーブル などに格納されているデータから、データを取得し、それをもとにオブジェクトを構築して返します。
さて、最も簡単な HQL の次は、2番目に簡単な HQL を見てみましょう。
from com.techscore.hibernate.chapter1.Book as book where book.price < 2000
この HQL は、price プロパティの値が 2000 以下である Book オブジェクトを検索するためのクエリです。
なんとなくイメージがつかめてきたでしょうか。
では、次節より、実際に Java プログラムから HQL
を発行して、オブジェクトを取得する方法を説明しましょう。
4.2 HQL の発行
前節で記述した、2番目に簡単な HQL を使って、実際に Book オブジェクトを取得してみましょう。
実は、ここで、以下のライブラリが必要になります。hibernate-3.0--lib--antlr-2.7.5H3.jar 前章同様に、
road_to_hbm_master--+--lib 以下にコピーして、ビルドパスに含めておきましょう。
早速ソースコードを紹介しますが、前章の BookSelecter.java とさほど変わりありません。
/** * BookSelecter.java * TECHSCORE Java Hibernate 2章 * * Copyright (c) 2005 Four-Dimensional Data, Inc. */package com.techscore.hibernate.chapter3;
import java.util.List; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; import com.techscore.hibernate.chapter1.Book; /** * 条件付きで Book オブジェクト取得するクラス */ public class BookSelecter { /** * データを検索するためのメインメソッド * @param args */ public static void main(String[] args) { Configuration config = new Configuration().configure(); SessionFactory sessionFactory = config.buildSessionFactory(); Session session = sessionFactory.openSession();Query query = getQuery(session); List list = query.list();
for (int i = 0; i < list.size(); i++) { System.out.println(((Book)list.get(i)).getName()); } session.close(); }private static Query getQuery(Session session) { String strQuery = "from com.techscore.hibernate.chapter1.Book as book " + " where book.price < 2000"; Query query = session.createQuery(strQuery); return query; }
}
本章は第3章ですので、パッケージを変更しています。
当然保存すべきフォルダも変更されます。src/com/techscore/hibernate/chapter3
フォルダを作成しましょう。
注目すべきは、30行目〜31行目
です。30行目では、getQuery メソッドを使って Query オブジェクトを取得しています。
40行目
から始まる getQuery メソッドでは、クエリ文字列を元に Query オブジェクトを生成し、返り値として返しています。
31行目では、Query オブジェクトで指定された条件にマッチするオブジェクトのリストを取得しています。