Hibernate 名前つきSQLクエリ - return-scalarで戻り値型の設定

2009/06/02 15:12Update
TAGS: Hibernate | 名前つきクエリ | Query | retrun | 戻り値 || return-scalar

Hibernate の名前つきSQLクエリの戻り値の型を特定な型に変換したい場合があります。こんな時、<return-scalar>や<return>を使います。本文は、<return-scalar>の使い方や注意点などについて解説します。

Hibernate 名前つきクエリの定義及び使い方について、次の記事をご参照ください。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
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を定義しましょう。

有关作者
Syboos.jp編集長システム設計や開発、保守運営などを行ってます。オープンソース技術に興味があります。

Sponsored Link


Comments