Hibernate は,テーブルやビューに対応した Java クラスを生成して自動的にマッピングしてくれますが,あからじめテーブルやビューを用意できず,実行時に問い合わせを行って結果が欲しい時もあります。
そういう状況に陥って困っていたのですが,調べたところネイティブな SQL 文を実行して結果を取得することが可能でした。
まず,SQL 文を指定して SQLQuery を生成します。
SQLQuery query = session.createSQLQuery(
"SELECT" +
" XXXX AS user_id," +
" XXXX AS age," +
" XXXX AS full_name " +
"FROM XXXX"
);
次は列ごとに返されるデータの型を指定します。これを行わなくても動作しますが,誤った型にマッピングされる場合があるので,指定する方が無難に感じます。
query.addScalar("user_id",
new org.hibernate.type.StringType());
query.addScalar("age",
new org.hibernate.type.IntegerType());
query.addScalar("full_name",
new org.hibernate.type.StringType());
あとはリストを要求すれば結果が得られます。ただしリスト中のデータは Object 型なので,先ほど指定した型にキャストしてアクセスします。
Iterator it = query.list().iterator();
while (it.hasNext()) {
Object[] row = (Object[])it.next();
String uid = (String)row[0];
int age = ((Integer)row[1]).intValue();
String name = (String)row[2];
・・・・
}
このように,Hibernate 経由で自由に SQL 文を発行して結果を得られますが,こういう使い方をすると Hibernate を使う意味が薄れますね。
