お勉強メモ
HQL
最終更新:
匿名ユーザー
-
view
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)");
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)");