Hibernate createSQLQuery 查询Oracle char类型结果为一个字符解决方法汇总
2011-12-21 11:40
791 查看
在使用Hibernate的原生态SQL对Oracle进行查询时,碰到查询char类型的时候始终返回的是一个字符,开始认为应该是Hibernate在做映射的把数据类型给映射成char(1),在经过查找网上的一些资料,得知产生这个问题的主要原因确实是Hibernate再查询Oracle的时候,将char自动映射成character(varchar的子集)类型,oracle的char字段在hibernate里映射为character类型,是varchar的子集。 现有以下几种解决方法: 1:将你要查询的实体转换成实体Bean,使用HQL查询,每个表都有映射文件配置,反向工程生成的映射文件里对于多字符的char会自动映射到java中的string类型。这样就不存在字段映射的问题了,但是这样不能使用SQL; 2:可以使用Hibernate中的addScalar(String arg,Type type)来自定义返回字段的类型,如: this.getSession().createSQLQuery("select id,name,state from tb") .addScalar("id", Hibernate.STRING) .addScalar("name", Hibernate.STRING) .addScalar("state", Hibernate.STRING ).list(); 这样就可以解决,但是这样的话,必须把所有要查询的字段进行定义,在字段比较多的时候,就相对比较麻烦; 3:在Oracle查询语句中直接指定数据格式,如: select id,name,cast(state as varchar2(xxx)) from tb --xx为长度比如:varchar2(200) 这种解决方法比较方便,只需要在查询语句指定char的返回类型,推荐使用这种方法进行查询。 4、修改hibernate默认的char映射类型 通过重写继承其方言类实现。自定义Hibernate Dialect.我用的数据库是ORACLE,: 首先建一个类,继承com.digitwater.fwk.hibernate.Oracle9iDialect,该类的内容如下: package com.digitwater.fwk.hibernate; import java.sql.Types; import org.hibernate.Hibernate; //****************************************************************** /** * 类名:com.digitwater.fwk.hibernate.Oracle9iDialect <pre> * 描述:修改hibernate方言 * 基本思路: * public方法: * 特别说明: * 编写者: wangbinbin * 版权: Copyright (C) 2011 版权所有 * 创建时间:Nov 30, 2011 5:19:57 PM * 修改说明: 类的修改说明 * </pre> */ //****************************************************************** public class Oracle9iDialect extends org.hibernate.dialect.Oracle9iDialect { /** * */ public Oracle9iDialect() { super(); registerHibernateType(Types.CHAR, Hibernate.STRING.getName()); } } 第二步,就是修改hibernate的配置文件hibernate.cfg.xml: 将: <prop key="hibernate.dialect">org.hibernate.dialect.Oracle9iDialect</prop> 改为: <prop key="hibernate.dialect">com.digitwater.fwk.hibernate.Oracle9iDialect</prop> 此方法改动是最小的。目前使用正常,暂时没发现其它问题。 附:oracle cast()函数用法: cast 是进行类型转换的, 可以针对各种Oracle数据类型. 修改的是用户的数据类型. round只是修改的数据显示格式. 对数据做四舍五入. 类似的函数还有ceil(取此数据的最小整数). trunc( 取整函数.) SQL> create table t1(a varchar(10)); Table created. SQL> insert into t1 values ('12.3456'); 1 row created. SQL> select round(a) from t1; ROUND(A) ---------- 12 SQL> select round(a,3) from t1; ROUND(A,3) ---------- 12.346 SQL> select cast(a as int) from t1; CAST(AASINT) ------------ 12 SQL> select cast(a as number(8,4)) from t1; CAST(AASNUMBER(8,4)) -------------------- 12.3456 |
相关文章推荐
- Hibernate SQLQuery 查询Oracle char类型结果为一个字符的解决方法
- SQLQuery 查询Oracle char类型返回一个字符有关问题
- Hibernate将sql查询结果中字符转为char类型的原因
- Hibernate的createSQLQuery 查询数据库类型为char的字段时要注意
- 解决 oracle查询时char类型为character只显示一个字符的问题
- Hibernate的createSQLQuery 查询数据库类型为char的字段时要注意
- Hibernate的createSQLQuery 查询数据库类型为char的字段时要注意
- Hibernate通过SQL查询常量时只能返回第一个字符的解决方法
- Hibernate通过SQL查询常量时只返回第一个字符解决方法
- hibernate查询数据表char类型字段只返回一个字符
- 使用hibernate的this.getSession().createSQLQuery(sql).list();方法查询数据时出现查到的数据和想象的不一致,很是郁闷,诡异
- Hibernate通过SQL查询常量时只能返回第一个字符的解决方法
- hibernate查询某一个对象后,执行createSQLQuery查询出现的问题
- 将hql的CreateSqlQuery的查询结果绑定一个新建的dto中
- Hibernate通过SQL查询常量时只能返回第一个字符的解决方法
- hibernate查询数据表char类型字段只返回一个字符
- Hibernate原生SQL(createSQLQuery,通过Transformers.ALIAS_TO_ENTITY_MAP设置生成MAP)查询,自动读取ORACLE CLOB内容的解决方案
- Hibernate通过SQL查询常量时只能返回第一个字符的解决方法
- Hibernate通过SQL查询常量时只能返回第一个字符的解决方法
- Hibernate通过SQL查询常量时只能返回第一个字符的解决方法 .