看起来 Hibernate 将类型的值读取为 .尝试将其投射到 :CHAR(n)
Character
VARCHAR(n)
Query q2 = em.createNativeQuery(
"select cast(sc_cur_code as VARCHAR2(3)), sc_amount from sector_costs");
当通过接口使用Hibernate时,您可以用代替(也可以通过JPA 2.0访问)设置一种结果类型:Session
addScalar()
unwrap()
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开始,Hibernate JIRA中有很多与此问题相关的未解决的问题。
以下是Max Rydahl Andersen对HHH-2220评论的解释:
目前,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>