2005.09.28 株式会社四次元データ 瀧下 浩
- 4.1. HQLの考え方
- 4.2. HQL の発行
- 4.3. 名前つきパラメータで条件を指定
- 4.4. 名前つきクエリで条件を指定する
- 4.5. ソート
- 4.6. その他
4.3 名前つきパラメータで条件を指定
変数の値をクエリ文字列に動的に埋め込む方法は、SQL インジェクションによる情報流出の危険 を伴うなど、あまりお勧めできるものではありません。
本節では、前節のprice < 2000
の「2000」という条件のように、
変数として動的に変更したい条件を含むクエリをスマートに扱う方法を紹介します。 java.sql.PreparedStatement の
Hibernate 版と言えるものです。サンプルを以下に示します。
private static Query getQuery(Session session) { String strQuery = "from com.techscore.hibernate.chapter1.Book as book " + " where book.price < :price"; Query query = session.createQuery(strQuery); query.setInteger("price", 2000); return query; }
このようにコロンを付けたプレースホルダー(ここでは :price )を記述しておくことで、 後から、query に対して値を設定することができるようになります。
4.4 名前つきクエリで条件を指定する
SQL を利用する場合もそうですが、Javaのソースコードにクエリ文字列を記述する方法は、 クエリが散在する点や、ソースコードの視認性が下がるなど、メンテナンスに悪影響を与えます。 そこで、Hibernate では、マッピングファイルにクエリを登録するという方法が用意されています。 これには、前章で作成した、「Book.hbm.xml」に手を入れる必要があります。
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.techscore.hibernate.chapter1.Book" table="BOOK">
<id name="isbn" type="string" unsaved-value="null" >
<column name="ISBN" sql-type="char(17)" not-null="true"/>
<generator class="assigned"/>
</id>
<property name="name" />
<property name="price" />
</class>
<query name="priceLessThan">
<![CDATA[ from com.techscore.hibernate.chapter1.Book as book
where book.price < :price ]]>
</query>
</hibernate-mapping>
16行目〜21行目
を追加してください。 次にソースコードを変更します。Query
を取得する際のメソッド名が変わっている点のみチェックしておいてください。
private static Query getQuery(Session session) { Query query = session.getNamedQuery("priceLessThan")
;
query.setInteger("price", 2000); return query; }
このように、getNamedQuery() メソッドで、マッピングファイル中に記述されている 名前つきクエリを指定することができ、3.3 名前つきパラメータで条件を指定 と同様の結果が得られます。
4.5 ソート
あるパラメータでソートした状態で検索したい場合があります。SQL の[ order by ]と同じ機能です。 HQL でも同様の記述が可能になっています。ここでは、クエリのみ例示するにとどめます。
from com.techscore.hibernate.chapter1.Book as book where book.price < :price order by book.price desc
4.6 その他
HQL では、その他さまざまなことが実現できます。- 特定のプロパティだけを取得
- 集約関数の取り扱い
- 結合
これらについては、またの機会に紹介することにします。