锁定老帖子 主题:一个无奈的Hibernate问题
精华帖 (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位嘛,觉得这个转换有问题!! 大家说说,又或者是本人太菜,学艺不精 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-09-18
没有OO还不如不用Hibernate。
Char(1)的问题没遇到过。因为没见过你们这种用法。典型把简单往麻烦里搞。 |
|
返回顶楼 | |
发表时间:2009-09-18
通过
public SQLQuery addScalar(String columnAlias, Type type) 限定他返回String就行 |
|
返回顶楼 | |
发表时间:2009-09-18
魔力猫咪 写道 没有OO还不如不用Hibernate。
Char(1)的问题没遇到过。因为没见过你们这种用法。典型把简单往麻烦里搞。 你说的很对,单从这个功能讲是不用Hibernate的。但是,这个功能只是整个大应用的很小一部分。而整个大系统是基于Hibernate上的,其他的模块是标准的OO建模。因此,目前只能从hibernate中获取jdbc的connection对象,来解决这个问题。 |
|
返回顶楼 | |
发表时间:2009-09-18
为什么呢?大不了新建一个专门的纯JDBC数据库连接就是了。你们使用了SQL,而且从这种使用上来看,也没什么缓存的问题。那么干脆就直接另建一个数据库连接好了。最多对这个连接进行限制,让其只能查询。
要不把其他持久化框架引进来。除非Hibernate使用了2级缓存,而你们的处理又会造成数据库数据变动。才不能不必须走Hibernate这条路。 |
|
返回顶楼 | |
发表时间:2009-09-18
魔力猫咪 写道 为什么呢?大不了新建一个专门的纯JDBC数据库连接就是了。你们使用了SQL,而且从这种使用上来看,也没什么缓存的问题。那么干脆就直接另建一个数据库连接好了。最多对这个连接进行限制,让其只能查询。
要不把其他持久化框架引进来。除非Hibernate使用了2级缓存,而你们的处理又会造成数据库数据变动。才不能不必须走Hibernate这条路。 额~~~你说的也对,不过那样又是一个连接池了。 实际上,我的问题不是用不用hibernate啊,而是有没有在Hibernate nativeSQL 执行中对char(n)的正确读取方法? |
|
返回顶楼 | |
发表时间: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,所以不清楚. |
|
返回顶楼 | |
发表时间: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了 |
|
返回顶楼 | |
发表时间:2009-09-18
SQLQuery query = session.createSQLQuery(); query.addScalar("列名", Hibernate.String) |
|
返回顶楼 | |
发表时间:2009-09-18
erotica 写道 SQLQuery query = session.createSQLQuery(); query.addScalar("列名", Hibernate.String) 知道这个方法,但问题是SQL是配置的,列名类型不确定,所以。。。无奈!! 谢谢大家了。估计要改Hibernate的源码才能解决了。 |
|
返回顶楼 | |