Hibernate  ネイティブSQLクエリ基本

2008/11/11 10:26Update
TAGS: Hibernate | SQL | クエリ

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へ、値をセットしていることを注意してください。

有关作者
Syboos.jp編集長AJavaやオープンソース情報の執筆、Webサイトの開発や運営全般の業務に携わる。

Sponsored Link


Comments