Hibernate 名前つきSQLクエリ - return-scalarで戻り値型の設定
2009/06/02 15:12Update
Hibernate の名前つきSQLクエリの戻り値の型を特定な型に変換したい場合があります。こんな時、<return-scalar>や<return>を使います。本文は、<return-scalar>の使い方や注意点などについて解説します。
Hibernate 名前つきクエリの定義及び使い方について、次の記事をご参照ください。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
Hibernateの名前つきクエリ - 定義方法及びその呼び方
Hibernateの名前つきクエリ - 戻り値の型と取得方法
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
<return-scalar>で、クエリの戻り値型の基本的な設定方法も「Hibernateの名前つきクエリ - 戻り値の型と取得方法」の中で簡単に説明しています。
基本的に、sql-queryの場合、クエリの戻り値に対して、return-scalarを使って一々定義しなくてもよいわけです。
では、何でreturn-scalarを使うの?
理由は簡単で、クエリの戻り値の型変換のためです。
例えば、
あるテーブルのフィールドはchar(1)と定義される場合、sql-queryを使ったクエリの戻り値のJava型はCharacterとなります、String型として扱いたい場合、return-scalarを使います。すると、Hibernateは、本来であるべきのCharacter型のデータをString型に自動的に変換してくれます。
1)定義方法
※java.lang.Integer⇔integerでもよい
※java.lang.String⇔string
2)一旦return-scalarで戻り値の型宣言を行う場合、全項目に対して定義しなければなりません。一部だけに定義した場合、クエリの戻り値にその定義した項目だけが返されます。
例えば、
の場合、クエリの戻り値に「フィールド名1」しかありませんので、ご注意ください。
3)return-scalarの定義順はクエリ戻り値の順序になります。
例えば、
Javaコード
objs[0]に「フィールド名2」の値が入っています。
objs[1]に「フィールド名1」の値が入っています。
なので、混乱を生じさせないためにも、できれば、クエリの定義順と同じ順でreturn-scalarを定義しましょう。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
Hibernateの名前つきクエリ - 定義方法及びその呼び方
Hibernateの名前つきクエリ - 戻り値の型と取得方法
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
<return-scalar>で、クエリの戻り値型の基本的な設定方法も「Hibernateの名前つきクエリ - 戻り値の型と取得方法」の中で簡単に説明しています。
何で<return-scalar>を使うの
基本的に、sql-queryの場合、クエリの戻り値に対して、return-scalarを使って一々定義しなくてもよいわけです。
では、何でreturn-scalarを使うの?
理由は簡単で、クエリの戻り値の型変換のためです。
例えば、
あるテーブルのフィールドはchar(1)と定義される場合、sql-queryを使ったクエリの戻り値のJava型はCharacterとなります、String型として扱いたい場合、return-scalarを使います。すると、Hibernateは、本来であるべきのCharacter型のデータをString型に自動的に変換してくれます。
<sql-query name="MemberDAO.getListByName"> <![CDATA[ SELECT m.ID as id, m.NAME as name, m.sex FROM MEMBER m WHERE m.NAME LIKE :name ]]> <return-scalar column="id" type="java.lang.Integer"/> <return-scalar column="name" type="java.lang.String"/> <return-scalar column="sex" type="java.lang.String"/> </sql-query>
<return-scalar>を利用する際の注意点
1)定義方法
<sql-query name="クエリ名"> <![CDATA[ SELECT フィールド名1, フィールド名2 ... FROM テーブル名 ]]> <return-scalar column="フィールド名1" type="java.lang.Integer"/> <return-scalar column="フィールド名2" type="java.lang.String"/> ... </sql-query>
※java.lang.Integer⇔integerでもよい
※java.lang.String⇔string
2)一旦return-scalarで戻り値の型宣言を行う場合、全項目に対して定義しなければなりません。一部だけに定義した場合、クエリの戻り値にその定義した項目だけが返されます。
例えば、
<sql-query name="クエリ名"> <![CDATA[ SELECT フィールド名1, フィールド名2 ... FROM テーブル名 ]]> <return-scalar column="フィールド名1" type="java.lang.Integer"/> </sql-query>
の場合、クエリの戻り値に「フィールド名1」しかありませんので、ご注意ください。
3)return-scalarの定義順はクエリ戻り値の順序になります。
例えば、
<sql-query name="クエリ名"> <![CDATA[ SELECT フィールド名1, フィールド名2 ... FROM テーブル名 ]]> <return-scalar column="フィールド名2" type="java.lang.String"/> <return-scalar column="フィールド名1" type="java.lang.Integer"/> </sql-query>
Javaコード
List <Object []> objsList = (List <Object []>)sess.getNamedQuery("クエリ名")
.list();
Object []objs = objsList.get[0];
objs[0]に「フィールド名2」の値が入っています。
objs[1]に「フィールド名1」の値が入っています。
なので、混乱を生じさせないためにも、できれば、クエリの定義順と同じ順でreturn-scalarを定義しましょう。
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)