2011-02-02 7 views
16

私は私が行うと、列SC_CUR_CODEはCHAR(3)Hibernateはネイティブクエリ - CHAR(3)列

であるOracleでテーブルを持っている:

Query q2 = em.createNativeQuery("select sc_cur_code, sc_amount from sector_costs"); 

    q2.setMaxResults(10); 

    List<Object[]> rs2 = q2.getResultList(); 

    for (Object[] o : rs2) { 
     System.out.println(">>> cur=" + o[0]); 
    } 

私の代わりにcur=EURcur=Ecur=Uを参照し、 cur=USD

o[0]は、私は完全なVALUを取得できますかjava.lang.Characterの

ですe EURおよびUSD

答えて

34

Hibernateは、タイプCHAR(n)の値をCharacterとして読み込んでいるようです。 VARCHAR(n)にキャストしてみます:

Query q2 = em.createNativeQuery(
    "select cast(sc_cur_code as VARCHAR2(3)), sc_amount from sector_costs"); 

Sessionインタフェースを介して、Hibernateを使用している場合、あなたはexplcitly(JPA 2.0でunwrap()経由でもアクセス可能)の代わりにaddScalar()と結果の種類を設定することができます。

あり
Query q2 = em.createNativeQuery(
    "select sc_cur_code, sc_amount from sector_costs"); 
q2.unwrap(SQLQuery.class).addScalar("sc_cur_code", StringType.INSTANCE); 

Hibernate JIRAのこの問題に関連する未解決の問題は、HHH-2220から始まります。ここで

はHHH-2220のコメントからマックスRydahlアンデルセンによって説明です:

現在Hibernateは/ Javaの型HibernateにSQL型から「オートマジック」のマッピングの種類をサポートしている - ことであるため、多くの曖昧さのをそのようなマッピングは、いつかあなたが実際に望むものと一致しないことがあります。

なぜなら、明示的なaddScalarを使用することをお勧めします。あるいは、コード全体でDialectのサブクラス化を使用して、可能な複数のマッピングのうちのどれを割り当てるかを指定したくない場合です。

CHARの問題が最も問題ですが、修正するのは簡単ではありません - 特定の長さではなく範囲をマップするためにregisterType(type、from、to、typename)が必要です...しかし、したがって、マッピングのあいまいさにぶつかる可能性があります(たとえば、他の時代の文字列などの配列が必要な場合もあります)。したがって、.addScalarを使用すると、ネイティブSQLクエリに推奨されます。自動検出は常に危険にさらされます。

ネイティブクエリがHibernateマッピング設定ファイルに記述されている場合は、返される値ごとに<return-scalar ...>を定義する必要があります。注意:戻り値の型を明示的に定義すると、自動検出はオフになり、宣言された列のみが返されるため、すべての戻り値を列挙する必要があります。

<sql-query name="myQuery"> 
    <query-param name="days" type="int" /> 
    <return-scalar column="count" type="int" /> 
    <return-scalar column="section_name" type="string" /> 
    <![CDATA[select count(id) as count, section_name from document where days <= :days]]> 
</sql-query> 
+0

はい、それです。この機能のjira問題を発見しました。 http://opensource.atlassian.com/projects/hibernate/browse/HHH-2304 – Guus

+0

素晴らしい説明!!! – lwpro2

+1

私はchar(10)として列を持っています。私はキャストしようとするとエラーが発生します(..as VARCHAR)。 – kommradHomer

関連する問題