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を使用する場合 インターフェイスでは、addScalar()
を使用して結果のタイプを明示的に設定できます 代わりに(unwrap()
からもアクセスできます JPA 2.0の場合):
Query q2 = em.createNativeQuery(
"select sc_cur_code, sc_amount from sector_costs");
q2.unwrap(SQLQuery.class).addScalar("sc_cur_code", StringType.INSTANCE);
HHH-2220以降、HibernateJIRAにはこの問題に関連する未解決の問題がたくさんあります。
HHH-2220のコメントからのMaxRydahlAndersenによる説明は次のとおりです。
現在、HibernateはSQLタイプからHibernate / Javaタイプへの一種の「自動マジック」マッピングをサポートしています。このようなマッピングを行う際の多くのあいまいさのために、実際に必要なものと一致しない場合があります。
そのため、明示的なaddScalarを使用することを常にお勧めします。または、コード全体でDialectのサブクラス化を使用して、複数の可能なマッピングのどれを使用するかを指定したくない場合は、
CHARの問題は最も問題のある問題ですが、修正するのは簡単ではありません。特定の長さではなく範囲をマップするには、registerType(type、from、to、typename)が必要です...しかし、それでも問題が発生する可能性がありますマッピングのあいまいさ(たとえば、配列が必要な場合や文字列が必要な場合など)。したがって、ネイティブSQLクエリには、.addScalarを使用することをお勧めします。自動検出によっては常にリスクが高く、最小限に抑える必要があります。
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>