Vypadá to, že Hibernate čte hodnotu typu CHAR(n)
jako Character
. Zkuste to přenést do VARCHAR(n)
:
Query q2 = em.createNativeQuery(
"select cast(sc_cur_code as VARCHAR2(3)), sc_amount from sector_costs");
Při použití režimu spánku prostřednictvím Session
rozhraní, můžete explicitně nastavit typ výsledku pomocí addScalar()
místo toho (také dostupné přes unwrap()
v 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);
Existuje spousta nevyřešených problémů souvisejících s tímto problémem v Hibernate JIRA, počínaje HHH-2220.
Zde je vysvětlení Maxe Rydahla Andersena z komentářů HHH-2220:
V současné době Hibernate podporuje jakési „automatické“ mapování z typů SQL na typy Hibernate/Java – kvůli mnoha nejasnostem při provádění takového mapování někdy nebude odpovídat tomu, co skutečně chcete.
Proto vždy doporučujeme použít explicitní addScalar NEBO, pokud nechcete, aby celý váš kód používal podtřídu Dialect k diktování, které z více možných mapování chcete.
Problém s CHAR je nejproblematičtější, ale není snadné jej opravit - potřebovali bychom registerType (typ, od, do, název typu) k mapování rozsahu místo konkrétní délky...ale i tak byste mohli narazit do mapování nejednoznačností (např. někdy chcete pole, jindy řetězec atd.) Proto je použití .addScalar doporučeno pro jakékoli nativní dotazování SQL - v závislosti na automatickém zjišťování bude vždy riskantní a mělo by být používáno jen minimálně.
Pokud máte svůj nativní dotaz popsaný v konfiguračním souboru mapování Hibernate, musíte definovat <return-scalar ...>
pro každou vrácenou hodnotu. Poznámka:Musíte vyčíslit všechny vrácené hodnoty, protože když explicitně definujete návratové typy, automatické zjišťování se vypne a vrátí se pouze deklarované sloupce.
<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>