HibernateはHQLというクエリを扱うことで、非常に柔軟な検索にも対応することができます。HQLはSQLによく似たクエリ言語なので、新たに言語を覚え直すという手間はほとんどありません。HQLは特殊な言語としてゼロから作られたものではなくSQLをオブジェクト指向風に少しラップしただけの言語といえます。そのためにSQLの柔軟性や機能を損なうことなく実行できるのです。
先ほど実行したサンプル中でも1つHQLを使用しています。
List
list = session.find(" FROM WorkGroup "); |
"FROM WorkGroup"と記述している部分がHQLです。このクエリによってマッピングファイルでWorkGroupクラスにマッピングされたデータを取得できます。
Entityクラスの指定は「クラス名のみ」の省略形での指定と「パッケージ名から」の完全修飾名での指定ができます。
サンプルではWorkGroupを主体とした検索を行いましたので、「1対多」のリレーションによる検索を行うことができました。同じサンプルを使用してMemberを主体として検索を行うと「多対1」の検索を行うことができます。「多対1」のリレーションイメージは以下のようになります。
HQLではWhere句による条件設定をはじめ、Group By〜やOrder By〜、サブクエリなど、SQLで実現できる多くの操作が実行可能です。
以下は、Where句条件を追加して検索する場合のHQLです。
HQLでは、次の例のような結合式を記述することによって、より明確に結合式を記述できます。いままでのHQLサンプルではSelect句を省略していました。この例で示すようにSelect句にはFrom句オブジェクトやプロパティ名を記述することが可能です。
Select mem |
また、以下の例のようにFetch句を追加することでObject配列にラップされないようにすることも可能です。
Select mem |
今回は、Hibernateを使ったオブジェクトのリレーショナルデータ処理を見てきました。リレーショナルデータの処理はデータベースを使用するアプリケーションを開発するうえで非常に重要な処理です。
Hibernateはデータ検索においても柔軟性を重視した設計となっており、リレーショナルデータベースの柔軟性を最大に活用するためにHQLを提供しています。この検索処理の柔軟性とパフォーマンスがアプリケーションの性能を決め、検索処理の容易さが開発の容易さの一部を担うことになります。
次回は、HibernateとEntity Bean、JDBCのそれぞれのパフォーマンスを比較してみましょう。
山本 大(やまもと だい)
株式会社クロノスに勤務するITアーキテクト。甲南大学 経営学部 卒業。J2EE、.NETにこだわらずベストソリューションを提供できるマルチプラットフォームアーキテクトを目指す。『XMLマスター教科書 プロフェッショナル』(翔泳社)や雑誌などで執筆活動も行っている。
Copyright © ITmedia, Inc. All Rights Reserved.