Hibernate 查询Oracle数据结果为一个字符解决方法汇总

 

在使用Hibernate的原生态SQL对Oracle进行查询时,碰到查询char类型的时候始终返回的是一个字符,开始认为应该是Hibernate在做映射的把数据类型给映射成char(1),在经过查找网上的一些资料,得知产生这个问题的主要原因确实是Hibernate再查询Oracle的时候,将char自动映射成character(varchar的子集)类型,oracle的char字段在hibernate里映射为character类型,是varchar的子集

1:将你要查询的实体转换成实体Bean</STRONG>,使用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 varchar(2)) from tb

这种解决方法比较方便,只需要在查询语句指定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;

 

/

/

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

————转自http://blog.sina.com.cn/s/blog_6bf3a474010121zt.html

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值