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 を使う意味が薄れますね。