Изглежда, че Hibernate чете стойност от тип CHAR(n)
като Character
. Опитайте да го прехвърлите към VARCHAR(n)
:
Query q2 = em.createNativeQuery(
"select cast(sc_cur_code as VARCHAR2(3)), sc_amount from sector_costs");
Когато използвате Hibernate чрез Session
интерфейс, можете изрично да зададете тип резултат с 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);
Има много нерешени проблеми, свързани с този проблем в Hibernate JIRA, като се започне от HHH-2220.
Ето обяснение от Макс Ридал Андерсен от коментарите на HHH-2220:
Понастоящем Hibernate поддържа един вид "автоматично" съпоставяне от SQL типове към типове Hibernate/Java - поради многото неясноти при извършването на такова картографиране понякога няма да съвпадне с това, което всъщност искате.
Ето защо винаги препоръчваме да използвате изрично addScalar OR, ако не искате целият ви код да използва подкласа на Dialect, за да диктува кое от множеството възможни съпоставяния искате.
Проблемът с CHAR е най-проблематичният, но не е лесен за поправяне - ще ни трябва registerType(type, from, to, typename), за да съпоставим диапазон вместо конкретна дължина... но дори и тогава можете да ударите в неяснотите при картографиране (напр. понякога искате масив, друг път низ и т.н.) Следователно използването на .addScalar се препоръчва за всякакви собствени sql заявки - в зависимост от автоматичното откриване винаги ще бъде рисковано и трябва да се използва само до минимум.
Ако имате собствената си заявка, описана в конфигурационния файл на Hibernate mappings, тогава трябва да дефинирате <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>