Sepertinya Hibernate membaca nilai tipe CHAR(n)
sebagai Character
. Coba kirim ke VARCHAR(n)
:
Query q2 = em.createNativeQuery(
"select cast(sc_cur_code as VARCHAR2(3)), sc_amount from sector_costs");
Saat menggunakan Hibernate melalui Session
antarmuka, Anda dapat secara eksplisit mengatur jenis hasil dengan addScalar()
sebagai gantinya (juga dapat diakses melalui unwrap()
di 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);
Ada banyak masalah yang belum terselesaikan terkait masalah ini di Hibernate JIRA, mulai dari HHH-2220.
Berikut penjelasan Max Rydahl Andersen dari komentar HHH-2220:
Saat ini Hibernate mendukung semacam pemetaan "otomatis" dari tipe SQL ke tipe Hibernate/Java - karena banyaknya ambiguitas dalam melakukan pemetaan seperti itu, terkadang hal itu tidak sesuai dengan apa yang sebenarnya Anda inginkan.
Itulah mengapa kami selalu menyarankan untuk menggunakan addScalar eksplisit ATAU jika Anda tidak ingin bahwa seluruh kode Anda menggunakan subkelas Dialek untuk menentukan mana dari beberapa kemungkinan pemetaan yang Anda inginkan.
Masalah dengan CHAR adalah yang paling bermasalah, tetapi tidak mudah untuk diperbaiki - kami akan membutuhkan registerType(type, from, to, typename) untuk memetakan rentang alih-alih panjang tertentu ... ke dalam ambiguitas pemetaan (Misalnya, kadang-kadang Anda menginginkan array, kali lain string, dll.) Oleh karena itu, penggunaan .addScalar direkomendasikan untuk kueri sql asli - bergantung pada penemuan otomatis akan selalu berisiko dan hanya boleh digunakan seminimal mungkin.
Jika Anda memiliki kueri asli yang dijelaskan dalam file konfigurasi pemetaan Hibernate, maka Anda perlu mendefinisikan <return-scalar ...>
untuk setiap nilai yang dikembalikan. Catatan:Anda harus menghitung semua nilai yang dikembalikan, seperti saat Anda mendefinisikan jenis pengembalian secara eksplisit, penemuan otomatis dimatikan dan hanya kolom yang dideklarasikan yang dikembalikan.
<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>