※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

HQL(Hibernate QueryLanguage)

SQLに似ているけどオブジェクトを返す点がちがう。
オブジェクト指向型SQL。
Session s;

Itemをすべて取得するHQLは次のようになる

List list = s.find("from Item");
for(int i=0;i<list.size();i+){
  Item item = (Item)list.get(i);
   ・・・
}


HQLでは表名の代わりにクラス名を指定する。
複数のクラスを扱う場合はパッケージ名をつけて指定することもできる。

HQLではselect句を省略できる。
省略しないとこんなかんじ。

List list = s.find("select Item from Item");

エイリアス、order by のやり方はSQLと一緒

List list = s.find("from Item as item order by item.price asc");

通常のSQLと同じようにWHERE句を指定できる。

List list = s.find("from Item item where item.price <2000");

値が変化するパラメータを指定する場合は次のようにQueryを利用する。単語の先頭に:(コロン)をつけるとパラメータとして扱われる。

Query q = s.createQuery
("from Item item where item.price > :min and item.price <:max);

q.setInteger("min",1000);
q.setInteger("max",2000);
List list = q.list();

q.list()の代わりにq.iterate()としてIteratorを取得することもできる。int型を設定するにはQuery#setIntegerを利用するが、Query#setStirng,Query#setDouble,などいろいろある。

またSQLでパラメータをPreparedStatementのように?で指定することもできる

Query q = s.createQuery
("from Item item where item.price> ? and item.price< ?");
q.setInteger(1,1000);
q.setInteger(2,2000);
List list = q.list();


特定の列を指定して検索するには次のように。
List list = s.find("select item.name from Item item");
for (int i=0;i<list.size();i++){
  String name = (String)list.get(i);
・・・
}

item.nameはitemオブジェクトのnameプロパティ。
検索結果はリストに格納される。
次のように複数の列を指定して検索することもできる。
複数の列を指定した場合、listにはオブジェクトの配列として検索結果が格納される。

List list = s.find("select item.name,item.price from Item item");
for(int i=0;i<list.size();i++){
  Object[] o = (Object[])list.get(i);
  String name = (String)o[0];
  Integer price = (Integer)o[1];
・・・
}


次のように集合関数も利用できる。
List list = s.find("select avg(item.price) from Item item");
Integer averagePrice = (Integer)list.get(0);


集合関数の結果はリストの0番目の要素に格納されている。
avg,sum,min,max,countなどの集合関数がデフォルトでサポートされている。

abs、sqrt、roundのようにRDBMS固有の関数も利用できる。

副問い合わせも可能。

在庫数が平均以上の商品を検索するには

List list = s.find("from Item as nokori where nokori.quantity > ( select avg(item.quantity) from Item item)");