首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

一个无奈的Hibernate有关问题

2012-10-25 
一个无奈的Hibernate问题背景:1.数据库使用Oracle,表字段 ColA 被定义为 char(10)(字段类型不能修改,这个

一个无奈的Hibernate问题
背景:
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位嘛,觉得这个转换有问题!!

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

35 楼 linliangyi2007 2009-09-21   timothy_bitty 写道dmewy 写道通过函数在SQL中把你的栏位强制转换成Varchar的..
具体用什么函数自己搜吧.trim 之类的都可以..


这个方法我认为是可行的,使用oracle的内置函数to_char, LZ可以试试

正解!
36 楼 lgdlgd 2009-09-21   我也发现没有白忙活,其实我的实现和你说的还是有些不一样的地方,应用场景不一样
你说的方法只能用于实体有映射的情况,之前没看出来,是因为正好我的实有映射
我的实现不需要任何映射。 37 楼 langhua9527 2009-09-23   是做分词的那个大哥吧。。。
听我说:“不要迷恋Hibernate,Hibernate只是一传说。。。” 38 楼 冰之沸点 2009-09-23   linliangyi2007 写道timothy_bitty 写道dmewy 写道通过函数在SQL中把你的栏位强制转换成Varchar的..
具体用什么函数自己搜吧.trim 之类的都可以..


这个方法我认为是可行的,使用oracle的内置函数to_char, LZ可以试试

正解!



楼主的问题我也遇到过,不过我没楼主那么复杂我就用了这个addScalar方法。

这位兄弟说的用trim或者是to_char我好像也试过,貌似是不行,但是我具体也不记得了,我也是实在逼不得已的情况才对每个属性都addScalar的,不然肯定在sql上做手脚了 39 楼 greenhunter 2009-09-24   lgdlgd 写道这个问题我遇到过,确实都是CharacterType这个类惹的祸,初步看到,HIBERNATE从JDBC取得数据库字段类型,判断如果是CHAR(具体代码好像是12,记不得了),就使用以上的那个类CharacterType来处理,然后这个类直接取第一位,也不管数据库是CHAR(1) 还是CHAR(n),我觉得这是明显有问题的,不知道是不是有什么特殊的原因,不过我使用处理String类型的那个类替换了这个类,到现在快一年了,没发现有什么不妥。

这个问题刚刚遇到,呵呵,支持lgdlgd 的解决方法 40 楼 linliangyi2007 2009-09-24   greenhunter 写道lgdlgd 写道这个问题我遇到过,确实都是CharacterType这个类惹的祸,初步看到,HIBERNATE从JDBC取得数据库字段类型,判断如果是CHAR(具体代码好像是12,记不得了),就使用以上的那个类CharacterType来处理,然后这个类直接取第一位,也不管数据库是CHAR(1) 还是CHAR(n),我觉得这是明显有问题的,不知道是不是有什么特殊的原因,不过我使用处理String类型的那个类替换了这个类,到现在快一年了,没发现有什么不妥。

这个问题刚刚遇到,呵呵,支持lgdlgd 的解决方法

说一句对JE上各位看官的感觉。请详细看明白提问者要描述的问题,同样一个问题,不同的人看到的东西大相径庭。
就这个问题来说,你可以认为楼主我Hibernate用的不好,评个新手;同样,也可以认真思考,像楼上的这位一样有所收获..总的来说,希望大家都有收获吧 41 楼 C_J 2009-09-25  
-"不过我使用处理String类型的那个类替换了这个类",没太明白这句话的意思? 是改了Hibernate的源码?还是?能说具体点做法么?


-Hibernate也是封装了JDBC,RS到POJO的映射应该很好做;


-因为LZ是无法确定哪个字段是否是CHAR(N)类型的,所以我想Trim()方法应该不适用;不可能每个返回列都Trim()吧? 42 楼 lgdlgd 2009-09-25   C_J 写道
-"不过我使用处理String类型的那个类替换了这个类",没太明白这句话的意思? 是改了Hibernate的源码?还是?能说具体点做法么?


-Hibernate也是封装了JDBC,RS到POJO的映射应该很好做;


-因为LZ是无法确定哪个字段是否是CHAR(N)类型的,所以我想Trim()方法应该不适用;不可能每个返回列都Trim()吧?
相当于改了源码,做法是把处理String的那个类COPY出来,名字和包改成ChacratorType一样,然后并不放回到Hibernate的JAR包,只放在自已的工程中,
其实不只是类似BUG需要这样处理,还有一些不满足需求的框架也需要这样复盖一下,所以我的应用中会有别的开源项目的包,这样正好哪天把Hibernate版本升级了,而且它没把这BUG处理掉的时候,我的代码也不受影响。
-因为LZ是无法确定哪个字段是否是CHAR(N)类型的,所以我想Trim()方法应该不适用;不可能每个返回列都Trim()吧?
这个分析得应该很对。 43 楼 lgdlgd 2009-09-25   C_J 写道
-"不过我使用处理String类型的那个类替换了这个类",没太明白这句话的意思? 是改了Hibernate的源码?还是?能说具体点做法么?


-Hibernate也是封装了JDBC,RS到POJO的映射应该很好做;


-因为LZ是无法确定哪个字段是否是CHAR(N)类型的,所以我想Trim()方法应该不适用;不可能每个返回列都Trim()吧?
漏了一点,除了名字和和路径,代码也有改,这个比较简单,不细说了

热点排行