Hibernate本机查询 – char(3)列
我在Oracle中有一个表,其中SC_CUR_CODE列是CHAR(3)
当我做:
Query q2 = em.createNativeQuery("select sc_cur_code, sc_amount from sector_costs"); q2.setMaxResults(10); List rs2 = q2.getResultList(); for (Object[] o : rs2) { System.out.println(">>> cur=" + o[0]); }
我看到cur=E
和cur=U
而不是cur=EUR
和cur=USD
o[0]
是java.lang.Character
我怎样才能获得EUR
和USD
的全部价值?
看起来Hibernate将CHAR(n)
类型的值读取为Character
。 尝试将其VARCHAR(n)
为VARCHAR(n)
:
Query q2 = em.createNativeQuery( "select cast(sc_cur_code as VARCHAR2(3)), sc_amount from sector_costs");
通过Session
接口使用Hibernate时,您可以使用addScalar()
来显式设置结果类型(也可以通过JPA 2.0中的addScalar()
访问):
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中存在许多与此问题相关的未解决问题。
以下是来自HHH-2220评论的Max Rydahl Andersen的解释:
目前,Hibernate支持从SQL类型到Hibernate / Java类型的一种“自动”映射 – 由于执行此类映射时存在许多歧义,因此它有时会与您实际需要的不匹配。
这就是为什么我们总是建议使用显式的addScalar OR,如果你不希望你的代码全部使用Dialect的子类来指示你想要多个可能的映射中的哪一个。
CHAR的问题是最成问题的,但它不容易修复 – 我们需要一个registerType(type,from,to,typename)来映射一个范围而不是一个特定的长度……但即使这样你也可以碰撞映射歧义(例如,有时你想要一个数组,其他时候是字符串等)因此,对于任何本机sql查询,建议使用.addScalar – 取决于自动发现将始终存在风险,并且应该只使用最少。
如果您在Hibernate映射配置文件中描述了本机查询,则需要为
每个值定义
。 注意:您必须枚举所有返回的值,因为当您明确定义返回类型时,将关闭自动发现并仅返回声明的列。
- Grails,使用withTransaction插入大量数据会导致OutOfMemoryError
- 如何使用链接表在Hibernate中映射多对多列表
- 创建bean’entalManagerFactory’时出错,嵌套HibernateException:无法获取默认的Bean Validation工厂
- 如何正确处理两个线程更新数据库中的同一行
- Hibernate:没有活动事务,createQuery无效
- 为什么在Dao设计模式或其他设计模式中使用接口
- org.hibernate.QueryException:JPA样式的位置参数不是一个完整的序数
- 在Swing应用程序中使用Hibernate进行会话管理
- 在Hibernate标准结果中排除bean的字段