论坛首页 Java企业应用论坛

一个无奈的Hibernate问题

浏览 18660 次
精华帖 (3) :: 良好帖 (0) :: 新手帖 (10) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-09-18  
背景:
1.数据库使用Oracle,表字段 ColA 被定义为 char(10)(字段类型不能修改,这个是接口方定的)
2.hibernate使用NativeSQL查询(由于项目种种原因,不能使用标准Hibernate的OO方式)。

问题:
从list中返回了List<Object[]>对象,but每行的Object[]中, ColA被Hibernate转成了Character对象,只有一位,后面的char都被截断了.
查了hibernate的文档,知道可以设定每个字段的转化类型,but我们的sql是动态配置的,并不能确定某个字段一定是那种类型,因此此方法不能用了。

暂时的方案:
退回jdbc时代,直接读取DB的META,然后在读数据。


这里的疑问是,为啥Hibernate对Char字段的映射只能是1位嘛,觉得这个转换有问题!!

大家说说,又或者是本人太菜,学艺不精

   发表时间:2009-09-18  
没有OO还不如不用Hibernate。
Char(1)的问题没遇到过。因为没见过你们这种用法。典型把简单往麻烦里搞。
0 请登录后投票
   发表时间:2009-09-18  
通过
   public SQLQuery addScalar(String columnAlias, Type type) 限定他返回String就行
0 请登录后投票
   发表时间:2009-09-18  
魔力猫咪 写道
没有OO还不如不用Hibernate。
Char(1)的问题没遇到过。因为没见过你们这种用法。典型把简单往麻烦里搞。


你说的很对,单从这个功能讲是不用Hibernate的。但是,这个功能只是整个大应用的很小一部分。而整个大系统是基于Hibernate上的,其他的模块是标准的OO建模。因此,目前只能从hibernate中获取jdbc的connection对象,来解决这个问题。
0 请登录后投票
   发表时间:2009-09-18  
为什么呢?大不了新建一个专门的纯JDBC数据库连接就是了。你们使用了SQL,而且从这种使用上来看,也没什么缓存的问题。那么干脆就直接另建一个数据库连接好了。最多对这个连接进行限制,让其只能查询。
要不把其他持久化框架引进来。除非Hibernate使用了2级缓存,而你们的处理又会造成数据库数据变动。才不能不必须走Hibernate这条路。
0 请登录后投票
   发表时间:2009-09-18  
魔力猫咪 写道
为什么呢?大不了新建一个专门的纯JDBC数据库连接就是了。你们使用了SQL,而且从这种使用上来看,也没什么缓存的问题。那么干脆就直接另建一个数据库连接好了。最多对这个连接进行限制,让其只能查询。
要不把其他持久化框架引进来。除非Hibernate使用了2级缓存,而你们的处理又会造成数据库数据变动。才不能不必须走Hibernate这条路。


额~~~你说的也对,不过那样又是一个连接池了。
实际上,我的问题不是用不用hibernate啊,而是有没有在Hibernate nativeSQL 执行中对char(n)的正确读取方法?
0 请登录后投票
   发表时间:2009-09-18  
变通的解决办法,使用一个代理方法不就行了.hibernate不直接操作ColA名称,而操作ColaString.而getColA()则适应你的接口

private String colAString;
char[] getColA() {
   return str.toCharArray();
}
public getColAString() {
   return colAString;
}
public setColAString(String v) {
   colAString = v;
}


个人在hibernate很少用到char,所以不清楚.
0 请登录后投票
   发表时间:2009-09-18  
badqiu 写道
变通的解决办法,使用一个代理方法不就行了.hibernate不直接操作ColA名称,而操作ColaString.而getColA()则适应你的接口

private String colAString;
char[] getColA() {
   return str.toCharArray();
}
public getColAString() {
   return colAString;
}
public setColAString(String v) {
   colAString = v;
}


个人在hibernate很少用到char,所以不清楚.



你这个是在Bean中实现的方法吧。我这边用不上,nativeSQL执行的时候,没有Bean可言的,否则直接将bean的colA映射成String就OK了
0 请登录后投票
   发表时间:2009-09-18  

SQLQuery query = session.createSQLQuery();
query.addScalar("列名", Hibernate.String)
0 请登录后投票
   发表时间:2009-09-18  
erotica 写道

SQLQuery query = session.createSQLQuery();
query.addScalar("列名", Hibernate.String)


知道这个方法,但问题是SQL是配置的,列名类型不确定,所以。。。无奈!!

谢谢大家了。估计要改Hibernate的源码才能解决了。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics