`
linliangyi2007
  • 浏览: 1012949 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

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

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

分享到:
评论
43 楼 lgdlgd 2009-09-25  
C_J 写道

-"不过我使用处理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()吧?
这个分析得应该很对。
41 楼 C_J 2009-09-25  

-"不过我使用处理String类型的那个类替换了这个类",没太明白这句话的意思? 是改了Hibernate的源码?还是?能说具体点做法么?


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


-因为LZ是无法确定哪个字段是否是CHAR(N)类型的,所以我想Trim()方法应该不适用;不可能每个返回列都Trim()吧?
40 楼 linliangyi2007 2009-09-24  
greenhunter 写道
lgdlgd 写道
这个问题我遇到过,确实都是CharacterType这个类惹的祸,初步看到,HIBERNATE从JDBC取得数据库字段类型,判断如果是CHAR(具体代码好像是12,记不得了),就使用以上的那个类CharacterType来处理,然后这个类直接取第一位,也不管数据库是CHAR(1) 还是CHAR(n),我觉得这是明显有问题的,不知道是不是有什么特殊的原因,不过我使用处理String类型的那个类替换了这个类,到现在快一年了,没发现有什么不妥。


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


说一句对JE上各位看官的感觉。请详细看明白提问者要描述的问题,同样一个问题,不同的人看到的东西大相径庭。
就这个问题来说,你可以认为楼主我Hibernate用的不好,评个新手;同样,也可以认真思考,像楼上的这位一样有所收获..总的来说,希望大家都有收获吧
39 楼 greenhunter 2009-09-24  
lgdlgd 写道
这个问题我遇到过,确实都是CharacterType这个类惹的祸,初步看到,HIBERNATE从JDBC取得数据库字段类型,判断如果是CHAR(具体代码好像是12,记不得了),就使用以上的那个类CharacterType来处理,然后这个类直接取第一位,也不管数据库是CHAR(1) 还是CHAR(n),我觉得这是明显有问题的,不知道是不是有什么特殊的原因,不过我使用处理String类型的那个类替换了这个类,到现在快一年了,没发现有什么不妥。


这个问题刚刚遇到,呵呵,支持lgdlgd 的解决方法
38 楼 冰之沸点 2009-09-23  
linliangyi2007 写道
timothy_bitty 写道
dmewy 写道
通过函数在SQL中把你的栏位强制转换成Varchar的..
具体用什么函数自己搜吧.trim 之类的都可以..



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


正解!



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

这位兄弟说的用trim或者是to_char我好像也试过,貌似是不行,但是我具体也不记得了,我也是实在逼不得已的情况才对每个属性都addScalar的,不然肯定在sql上做手脚了
37 楼 langhua9527 2009-09-23  
是做分词的那个大哥吧。。。
听我说:“不要迷恋Hibernate,Hibernate只是一传说。。。”
36 楼 lgdlgd 2009-09-21  
我也发现没有白忙活,其实我的实现和你说的还是有些不一样的地方,应用场景不一样
你说的方法只能用于实体有映射的情况,之前没看出来,是因为正好我的实有映射
我的实现不需要任何映射。
35 楼 linliangyi2007 2009-09-21  
timothy_bitty 写道
dmewy 写道
通过函数在SQL中把你的栏位强制转换成Varchar的..
具体用什么函数自己搜吧.trim 之类的都可以..



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


正解!
34 楼 linliangyi2007 2009-09-21  
lgdlgd 写道
靠,果然可以,字段中间也可以加下杠,居然也能对应上,看来HIBERNATE也做同样的处理,呵呵,白忙呼了


没有白忙活的说法,至少你是彻底理解掌握了Bean的属性映射处理能力了。
造车轮的最大好处就是,制造者对车轮的了解远胜于使用者,呵呵。
33 楼 timothy_bitty 2009-09-21  
dmewy 写道
通过函数在SQL中把你的栏位强制转换成Varchar的..
具体用什么函数自己搜吧.trim 之类的都可以..



这个方法我认为是可行的,使用oracle的内置函数to_char, LZ可以试试
32 楼 lgdlgd 2009-09-21  
靠,果然可以,字段中间也可以加下杠,居然也能对应上,看来HIBERNATE也做同样的处理,呵呵,白忙呼了
31 楼 linliangyi2007 2009-09-21  
lgdlgd 写道
我的意思是按照我之前说的改了CharacterType类后对其返回结果进行封装,
你是说HIBERNATE已经有对没有映射的表使用SQL查询也能封装?我白忙呼了?


是啊,已经封装了,以下是来自Hiberante参考文档的原文:
引用

16.1.2. 实体查询(Entity queries)
     上面的查询都是返回标量值的,也就是从resultset中返回的“裸”数据。下面展示如何通
过addEntity()让原生查询返回实体对象。
sess.createSQLQuery("SELECT * FROM CATS").addEntity(Cat.class);
sess.createSQLQuery("SELECT ID, NAME, BIRTHDATE FROM CATS").addEntity(Cat.class);

This query specified:
  •SQL查询字符串
  •要返回的实体
假设Cat被映射为拥有ID,NAME和BIRTHDATE三个字段的类,以上的两个查询都返回一个List,每个
元素都是一个Cat实体。

30 楼 lgdlgd 2009-09-21  
我的意思是按照我之前说的改了CharacterType类后对其返回结果进行封装,
你是说HIBERNATE已经有对没有映射的表使用SQL查询也能封装?我白忙呼了?
29 楼 linliangyi2007 2009-09-21  
lgdlgd 写道
我做了一个对HIBERNATE的SQL查询结果集自动转换成POJO的类,有兴趣的话可以到我博客看看,欢迎给意见。



谢谢,这个功能Hibernate不是已经有了,而且对Bean的封装也有很多开源工具支持了啊。

我的问题是,从Hiberante返回的结果中,已经出现的错误,而不是后期封装问题。
28 楼 lgdlgd 2009-09-21  
我做了一个对HIBERNATE的SQL查询结果集自动转换成POJO的类,有兴趣的话可以到我博客看看,欢迎给意见。
27 楼 linliangyi2007 2009-09-21  
zwq4166506 写道
不是hibernate的问题,而是Java的char只能是一位。。
应该在hql中cast(ColA as varcher2(10)).
请问LZ,hibernate如何做到动态配置映射?


做动态映射应该不是很难的问题,JDBC中是可以获取DB的Meta的,Hibernate中也使用了对各个Meta类型的映射类进行转换的。
26 楼 linliangyi2007 2009-09-21  
caoyangx 写道
spring jdbc 很适合你的项目。
你这个问题可不是hibernate无奈的问题,而是你的需求选错了技术方案。


不是简单的选错方案的问题啊,如果是个单一的项目,大可以不用Hibernate,上面已经说了,项目的大部分都是OO方式设计的,只有一小部分需要直接的jdbc,原想Hibernate也可以直接支持的。

兄弟你没看问题的背景,而且Hibernate对Char的转化确实存在不妥,怎么能简单的只截取一位的Char呢?!。
25 楼 dmewy 2009-09-21  
通过函数在SQL中把你的栏位强制转换成Varchar的..
具体用什么函数自己搜吧.trim 之类的都可以..
24 楼 caoyangx 2009-09-21  
spring jdbc 很适合你的项目。
你这个问题可不是hibernate无奈的问题,而是你的需求选错了技术方案。

相关推荐

    hibernate的第一个例子

    **标题解析:**“hibernate的第一个例子”表明这是一个关于Hibernate框架的基础教程,主要目标是展示如何使用Hibernate进行数据持久化操作。 **描述分析:**描述提到这是一个超级简单的例子,包含一个持久化对象...

    hibernate第一个hibernate

    《Hibernate入门:初识与实践》 ...总之,"hibernate第一个hibernate"项目是一个绝佳的起点,它将引导你了解并掌握Hibernate的基本概念和操作。通过实践,你可以逐步熟悉ORM思想,为后续的Java开发奠定坚实的基础。

    第一个手写Hibernate

    "第一个手写Hibernate"项目旨在帮助开发者深入理解Hibernate的工作原理,通过手动编写相关代码,以实践的方式来学习和掌握Hibernate的核心概念。 **一、Hibernate简介** Hibernate是一个开源的ORM框架,它允许...

    菜鸟快速运行第一个hibernate

    ”表达了这个教程的目标是避免新手在学习过程中遇到常见问题,确保他们能够顺利地完成第一个Hibernate应用的搭建和运行。 **知识点详解** 1. **Hibernate简介**:Hibernate是一个开源的ORM框架,它将Java对象与...

    springMvc+Hibernate实现的一个问题管理系统

    本文将深入探讨如何使用SpringMvc和Hibernate这两个强大的框架,构建一个功能完善的问题管理系统。首先,我们来看看SpringMvc和Hibernate的核心概念及其在项目中的作用。 SpringMvc是Spring框架的一个模块,专门...

    hibernate第一个例子

    【hibernate第一个例子】 在Java开发中,Hibernate是一个非常重要的对象关系映射(ORM)框架,它极大地简化了数据库操作。本示例将引导初学者了解如何使用Hibernate进行简单的数据库连接和操作。 首先,我们需要...

    Hibernate面试题专栏 - 最全的Hibernate面试题, Hibernate笔试题, Hibernate问题

    Hibernate是一个用于简化Java数据库编程的开源框架,它提供了一种在Java应用程序中持久化对象的方式,避免了直接编写SQL语句,提高了开发效率。 **1. Hibernate基本概念** - **对象关系映射(ORM)**: ORM是将...

    hibernate完整的一个项目

    **hibernate完整的一个项目** 本项目旨在提供一个完整的Hibernate框架的实现,涵盖了从环境搭建到实际应用的全过程。Hibernate是Java开发中的一个强大的对象关系映射(ORM)框架,它简化了数据库与Java对象之间的...

    Hibernate 配置各种数据库

    Hibernate 是一个基于 Java 的持久层框架,提供了一个抽象的数据访问层,能够与多种数据库进行集成。在 Hibernate 的配置文件中,我们可以配置不同的数据库连接,包括驱动程序、URL 等信息。 配置 Hibernate 连接...

    hibernate需要的10个jar

    在Java开发领域,Hibernate是一个非常重要的对象关系映射(ORM)框架,它简化了数据库操作,使得开发者可以使用面向对象的方式来处理数据。当涉及到Hibernate项目时,为了使其正常运行,通常需要一系列的JAR(Java ...

    Hibernate Hibernate5 讲义 PDF

    Hibernate是一个开源的对象关系映射(ORM)框架,它封装了JDBC(Java Database Connectivity)的复杂性,并允许Java开发者以面向对象的方式操作数据库。Hibernate框架被广泛应用于企业级Java应用程序中,可以与...

    Hibernate实践例子程序

    Hibernate 是一个开源的O/R mappimg的框架,基于JDBC提供了一种持久性数据管理的方案,相对于EntityBean来说是相当轻量级的。由于Hibernate是基于 JDBC的,所以它的数据库查寻的能力相对于CMP来说也是异常强大的,...

    我的第一个hibernate例子

    # Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的...

    Hibernate入门到精通

    Hibernate 是一个基于Java的ORM(Object-Relational Mapping,对象关系映射)框架,它提供了一种简洁高效的方式来访问和操作关系数据库。下面是 Hibernate 的主要知识点: Hibernate 简介 Hibernate 是一个开源的...

    Hibernate相关jar包括新版本jdk不兼容旧版本的jar.zip

    因此,"解决Hibernate与jdk新版本不兼容的jar问题"可能是提供了一个升级后的Hibernate库,或者是包含了特定的补丁或者配置,使得Hibernate能够在新JDK环境下正常工作。 在"lib"目录下,可能包含了所有必要的...

    Hibernate update问题

    Hibernate,一个强大的Java对象关系映射(ORM)框架,极大地简化了数据库操作。在处理数据更新时,Hibernate提供了多种方法,但同时也可能会遇到一些常见问题。本篇文章将深入探讨Hibernate更新机制及其可能遇到的...

    第一个Hibernate代码, Hello Hibernate

    "第一个Hibernate代码, Hello Hibernate" 这个标题表明我们将要探讨的是一个初学者级别的Hibernate教程,可能是通过一个简单的项目或示例来介绍如何使用Hibernate框架。Hibernate是一个开源的对象关系映射(ORM)...

    一个好的hibernate源代码有server2008数据库

    标题提到的是“一个好的hibernate源代码有server2008数据库”。这里我们可以理解为,这是一个关于Hibernate框架的示例项目,它使用了Microsoft SQL Server 2008作为后端数据库。Hibernate是Java开发中常用的一个对象...

    JSP+Hibernate实现留言板

    Hibernate是一个流行的开源对象关系映射(ORM)框架,它简化了Java应用与关系型数据库之间的交互。通过Hibernate,开发者可以使用面向对象的方式处理数据库操作,而无需关心底层SQL语句的编写。 在留言板系统中,...

    Hibernate,hibernate笔记

    Hibernate 是一个开源的对象关系映射(ORM)框架,它允许Java开发者使用面向对象的方式来操作数据库。这个框架将数据库操作转化为对Java对象的操作,简化了数据持久化的复杂度。以下是对Hibernate的一些关键知识点的...

Global site tag (gtag.js) - Google Analytics