Hibernate ネイティブSQLクエリ基本
2008/11/11 10:26Update
Hibernateでは、オブジェクト指向のクエリ言語だけではなく、ネイティブSQLクエリを利用することもできます。
概要
ネイティブSQLクエリを利用するには、Session.createSQLQuery(String sql)を使用します。
Session session = ...
SQLQuery query = session.createSQLQuery("SELECT * FROM some_table");
query.setMaxResults(20);
List result = query.list();
また、次のように、外部マッピングファイル(.hbm.xml)の中に定義されている 「名前つきクエリ」を指定することができます。
SQLQuery query = (SQLQuery)session.getNamedQuery("MyQueryName");
//Query query = session.getNamedQuery("MyQueryName");
query.setMaxResults(20);
List result = query.list();
この場合、外部設定ファイル次のような定義が必要:
MyQuery.hbm.xml
<sql-query name="MyQueryName"> <![CDATA[ SELECT * FROM some_table ]]> </sql-query>
使い方例
■Hibernate SQL基本的な使い方<例1>
Session session = getSession(); //セッションの取得
//Hibernate SQL使い方例1:指定するカラムのみを取得する
String sql = "SELECT u.USER_ID as userId FROM MST_USER u";
//String sql = "SELECT u.USER_ID as userId, u.USER_NAME AS userName FROM MST_USER u";
List <String> list1 = session.createSQLQuery(sql) //SQLQueryインスタンスを生成
.addScalar("userId", Hibernate.STRING) //SQLQuery.addScalarメソッドで戻り値userNameの型設定
.list(); //Query.listメソッドでクエリの実行
System.out.println("1:" + list1.get(0));
解説:
※1、session.createSQLQuery(sql)でSQLQuery のインスタンスを作成します。SQLQueryはネイティブなSQLを実行するためのAPIを提供するインタフェースです。
※2、SQLQuery.addScalarメソッドは戻り値の型を指定するメソッドで、カラムをその指定された型で戻ります。省略が可能。
※3、Query.listメソッドは、クエリを実行します。カラムは一つの場合、List<Object>の形で返します、複数の場合、List <Object[]>の形で返します。
■Hibernate SQL基本的な使い方<例2>
sql = "SELECT {u.*} FROM MST_USER u";
//sql = "SELECT {u.*} FROM MST_USER {u}"; //この書き方もよい
List <MstaUser> list2 = session.createSQLQuery(sql) //SQLQueryインスタンスを生成
.addEntity("u", MstaUser.class) //SQLQuery.addEntityメソッドで戻り値 u の型設定
.list(); //Query.listメソッドでクエリの実行
System.out.println("2:" + list2.get(0).getUserName());
解説
※1、uはテーブルMST_USERの別名です。{u.*}とは テーブルすべてのカラム値を uという別名で表すMstaUserオブジェクトのプロパティにセットするようHibernateに指示するものの、そして結果をMstUser型のListで返します。
※2、.addEntity("u", MstaUser.class)は 別名 u をMstaUserとバインドさせます。
次の書き方もよい。
sql = "SELECT u.* FROM MST_USER u"; List <MstaUser> list5 = session.createSQLQuery(sql) //SQLQueryインスタンスを生成 .addEntity(MstaUser.class) //SQLQuery.addEntityメソッドで戻り値 u の型設定 .list(); //Query.listメソッドでクエリの実行 System.out.println(list5.get(0).getUserName());
■Hibernate SQL基本的な使い方<例3>
sql = "SELECT u.ID as {u.id}, u.USER_ID as {u.userId} FROM MST_USER_HIS u where {u.userId} = :userId";
List <MstaUser> list6 = session.createSQLQuery(sql) //SQLQueryインスタンスを生成
.addEntity("u", MstaUser.class) //SQLQuery.addEntityメソッドで戻り値 u の型設定
.setParameter("userId", "someId") //Query.setParameterメソッドでパラメータの設定
.list(); //Query.listメソッドでクエリの実行
System.out.println("User Id:" + list6.get(0).getUserId());
System.out.println("User Name:" + list6.get(0).getUserName());
解説:
※1、これはテーブル MST_USER_HIS.ID カラムの値を → MstaUser.idプロパティに、MST_USER_HIS.USER_ID カラムの値を → MstaUser.userIdプロパティにセットすることになります。
※2、戻り値はMstUser型のListです。
※3、この例では、異なったテーブルMST_USER_HISからマッピング・メタデータで定義されたクラスMstUserへ、値をセットしていることを注意してください。
Sponsored Link
- Relative Articles
- Hibernate設定ファイルその1 - hibernate.cfg.xml - (2008/07/09 14:08)
- Hibernate c3p0 - よく利用されているコネクションプーリング - (2008/07/09 15:00)
- Hibernate 方言(Dialect)一覧 - (2008/07/09 15:10)
- Hibernate のSessionとSessionFactory - (2008/07/09 15:51)
- ThreadLocal でHibernate Session を効率的に管理する - (2008/07/09 18:43)
- Hibernateで複数のDBに接続するには? - (2008/07/09 18:47)
- Hibernateとは - (2008/07/11 14:23)
- Hibernate のインストール - (2008/07/24 11:01)
- Hibernate の開発手順 - (2008/07/24 12:44)
- Hibernate SQLをログに出力方法 - (2008/07/30 16:06)