Wygląda na to, że Hibernate odczytuje wartość typu CHAR(n)
jako Character
. Spróbuj przesłać go do VARCHAR(n)
:
Query q2 = em.createNativeQuery(
"select cast(sc_cur_code as VARCHAR2(3)), sc_amount from sector_costs");
Podczas korzystania z Hibernacji przez Session
interfejs, możesz wyraźnie ustawić typ wyniku za pomocą addScalar()
zamiast tego (dostępne również przez unwrap()
w 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);
Istnieje wiele nierozwiązanych problemów związanych z tym problemem w Hibernate JIRA, począwszy od HHH-2220.
Oto wyjaśnienie Maxa Rydahla Andersena z komentarzy HHH-2220:
Obecnie Hibernate obsługuje rodzaj "automatycznego" mapowania z typów SQL na typy Hibernate/Java - ze względu na wiele niejasności związanych z wykonaniem takiego mapowania czasami nie będzie ono odpowiadać temu, czego faktycznie chcesz.
Dlatego zawsze zalecamy użycie jawnego addScalar OR, jeśli nie chcesz, aby w całym kodzie używano podklas Dialect do dyktowania, które z wielu możliwych mapowań chcesz.
Problem z CHAR jest najbardziej problematyczny, ale nie jest łatwy do naprawienia - potrzebowalibyśmy registerType(type, from, to, typename) do mapowania zakresu zamiast określonej długości...ale nawet wtedy można by bump w niejednoznaczności mapowania (np. czasami chcesz tablicę, innym razem łańcuch itp.) Dlatego użycie .addScalar jest zalecane dla każdego natywnego zapytania sql - w zależności od automatycznego wykrywania zawsze będzie ryzykowne i powinno być używane tylko do minimum.
Jeśli masz natywne zapytanie opisane w pliku konfiguracyjnym Hibernate mappings, musisz zdefiniować <return-scalar ...>
dla każdej zwróconej wartości. Uwaga:Musisz wyliczyć wszystkie zwracane wartości, ponieważ podczas jawnego definiowania zwracanych typów, automatyczne wykrywanie jest wyłączane i zwracane są tylko zadeklarowane kolumny.
<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>