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 varchar(2)) from tb
这种解决方法比较方便,只需要在查询语句指定char的返回类型,推荐使用这种方法进行查询。
4、修改hibernate默认的char映射类型
通过重写继承其方言类实现。自定义Hibernate Dialect.我用的数据库是ORACLE,:首先建一个类,继承com.digitwater.fwk.hibernate.Oracle9iDialect,该类的内容如下:
public class MySQLDialect extends MySQL5Dialect {
public MySQLDialect() {
super();
registerHibernateType(Types.CHAR, Hibernate.STRING.getName());
}
}
第二步,就是修改hibernate的配置文件hibernate.cfg.xml:
将:<prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
改为:<prop key="hibernate.dialect">com.fy.mgr.support.MySQLDialect</prop>
此方法改动是最小的。目前使用正常,暂时没发现其它问题。
5、 Hibernate中将SQL查询出来字段转换为对象的方法有两种
1.使用ResultTransformer,代码如下query.setResultTransformer(new AliasToBeanResultTransformer(StudentDTO.class)).list()
这种方法要求数据库的字段名和类的属性的大小写必须一致,但是Oracle查询返回的字段名却全是大写。
2.使用addEntity方法,这种方法的缺点是SQL必须写成select * from users的形式或select {a.*},{b.*} from a,b where...的格式附: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