`
linliangyi2007
  • 浏览: 1016478 次
  • 性别: 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无奈的问题,而是你的需求选错了技术方案。

相关推荐

    StrutsHibernateSpring纯环境 解压即用

    StrutsHibernateSpring纯环境 修改一下数据源就可以用了,不要改变applicationContext.xml,hibernate.cfg.xml的位置,要不Eclipse会有BUG,就不能能过eclpise生成文件了 对于这个问题我也很无奈

    JavaEye论坛热点推荐_-_2009年09月_-_总第16期.pdf

    - **一个无奈的Hibernate问题**:讨论了一个使用Hibernate过程中遇到的特定问题,可能涉及到实体关系映射或事务管理。 - **修改Java文件后不再需要重启服务器**:介绍了一种动态编译和加载Java类的技术,使得修改...

    简单易学的jsp 聊天室

    6. **安全性**:虽然这是一个简单的学习项目,但仍然需要注意一些基本的安全性问题,比如防止SQL注入、XSS攻击等。开发者可能需要对用户输入进行过滤和转义,确保数据安全。 7. **部署与运行**:完成开发后,你需要...

    超详细-张孝祥java面试宝典-完整版

    - **面试题目示例**:给出一个具体的场景,要求设计出满足该场景需求的类结构;解释观察者模式的具体应用场景。 #### 三、项目经验的重要性 在Java面试中,项目经验往往成为评判候选人技术水平的关键因素之一。本...

    实时监控体系:基于Prometheus的API性能指标可视化方案.pdf

    在日常的工作和学习中,你是否常常为处理复杂的数据、生成高质量的文本或者进行精准的图像识别而烦恼?DeepSeek 或许就是你一直在寻找的解决方案!它以其高效、智能的特点,在各个行业都展现出了巨大的应用价值。然而,想要充分发挥 DeepSeek 的优势,掌握从入门到精通的知识和技能至关重要。本文将从实际应用的角度出发,为你详细介绍 DeepSeek 的基本原理、操作方法以及高级技巧。通过系统的学习,你将能够轻松地运用 DeepSeek 解决实际问题,提升工作效率和质量,让自己在职场和学术领域脱颖而出。现在,就让我们一起开启这场实用又高效的学习之旅吧!

    5个提升DeepSeekAPI生成质量的调参技巧,开发者必看!.pdf

    在日常的工作和学习中,你是否常常为处理复杂的数据、生成高质量的文本或者进行精准的图像识别而烦恼?DeepSeek 或许就是你一直在寻找的解决方案!它以其高效、智能的特点,在各个行业都展现出了巨大的应用价值。然而,想要充分发挥 DeepSeek 的优势,掌握从入门到精通的知识和技能至关重要。本文将从实际应用的角度出发,为你详细介绍 DeepSeek 的基本原理、操作方法以及高级技巧。通过系统的学习,你将能够轻松地运用 DeepSeek 解决实际问题,提升工作效率和质量,让自己在职场和学术领域脱颖而出。现在,就让我们一起开启这场实用又高效的学习之旅吧!

    ACM动态规划模板-区间修改线段树问题模板

    ACM动态规划模板-区间修改线段树问题模板

    深度解析C语言调试技巧:VSCode+GDB实战排错指南.pdf

    # 踏入C语言的奇妙编程世界 在编程的广阔宇宙中,C语言宛如一颗璀璨恒星,以其独特魅力与强大功能,始终占据着不可替代的地位。无论你是编程小白,还是有一定基础想进一步提升的开发者,C语言都值得深入探索。 C语言的高效性与可移植性令人瞩目。它能直接操控硬件,执行速度快,是系统软件、嵌入式开发的首选。同时,代码可在不同操作系统和硬件平台间轻松移植,极大节省开发成本。 学习C语言,能让你深入理解计算机底层原理,培养逻辑思维和问题解决能力。掌握C语言后,再学习其他编程语言也会事半功倍。 现在,让我们一起开启C语言学习之旅。这里有丰富教程、实用案例、详细代码解析,助你逐步掌握C语言核心知识和编程技巧。别再犹豫,加入我们,在C语言的海洋中尽情遨游,挖掘无限可能,为未来的编程之路打下坚实基础!

    10个高效调用DeepSeekAPI的技巧:从请求优化到缓存策略.pdf

    在日常的工作和学习中,你是否常常为处理复杂的数据、生成高质量的文本或者进行精准的图像识别而烦恼?DeepSeek 或许就是你一直在寻找的解决方案!它以其高效、智能的特点,在各个行业都展现出了巨大的应用价值。然而,想要充分发挥 DeepSeek 的优势,掌握从入门到精通的知识和技能至关重要。本文将从实际应用的角度出发,为你详细介绍 DeepSeek 的基本原理、操作方法以及高级技巧。通过系统的学习,你将能够轻松地运用 DeepSeek 解决实际问题,提升工作效率和质量,让自己在职场和学术领域脱颖而出。现在,就让我们一起开启这场实用又高效的学习之旅吧!

    基于Python语言的PersonRelationKnowledgeGraph设计源码

    本项目为Python语言开发的PersonRelationKnowledgeGraph设计源码,总计包含49个文件,涵盖19个.pyc字节码文件、12个.py源代码文件、8个.txt文本文件、3个.xml配置文件、3个.png图片文件、2个.md标记文件、1个.iml项目配置文件、1个.cfg配置文件。该源码库旨在构建一个用于表示和查询人物关系的知识图谱系统。

    成本优化指南:通过Token计算模型将API费用降低57%的秘诀.pdf

    在日常的工作和学习中,你是否常常为处理复杂的数据、生成高质量的文本或者进行精准的图像识别而烦恼?DeepSeek 或许就是你一直在寻找的解决方案!它以其高效、智能的特点,在各个行业都展现出了巨大的应用价值。然而,想要充分发挥 DeepSeek 的优势,掌握从入门到精通的知识和技能至关重要。本文将从实际应用的角度出发,为你详细介绍 DeepSeek 的基本原理、操作方法以及高级技巧。通过系统的学习,你将能够轻松地运用 DeepSeek 解决实际问题,提升工作效率和质量,让自己在职场和学术领域脱颖而出。现在,就让我们一起开启这场实用又高效的学习之旅吧!

    大华智能物联平台,的对接其他接口的API,可以获得视频拉流的flv/hls/rstp 的拉流地址,demo项目为springBoot项目,可以通过摄像头的视频通道,获取到实时拉流的uRl

    rtsp实时预览接口URL:/evo-apigw/admin/API/MTS/Video/StartVideo HLS、FLV、RTMP实时预览接口方式 :接口URL/evo-apigw/admin/API/video/stream/realtime 参数名 必选 类型 说明 data true string Json串 +channelId true string 视频通道编码 +streamType true string 码流类型:1=主码流, 2=辅码流,3=辅码流2 +type true string 协议类型:hls,hlss,flv,flvs,ws_flv,wss_flv,rtmp hls:http协议,m3u8格式,端口7086; hlss:https协议,m3u8格式,端口是7096; flv:http协议,flv格式,端口7886; flvs:https协议,flv格式,端口是7896; ws_flv:ws协议,flv格式,端口是7886; wss_flv:wss协议,flv格式,端口是7896; rtmp:rtmp协议,端口是1975;

    Simulink永磁风机飞轮储能系统二次调频技术研究:频率特性分析与参数优化,Simulink永磁风机飞轮储能二次调频技术:系统频率特性详解及参数优化研究参考详实文献及两区域系统应用,simulink

    Simulink永磁风机飞轮储能系统二次调频技术研究:频率特性分析与参数优化,Simulink永磁风机飞轮储能二次调频技术:系统频率特性详解及参数优化研究参考详实文献及两区域系统应用,simulink永磁风机飞轮储能二次调频,系统频率特性如下,可改变调频参数改善频率。 参考文献详细,两区域系统二次调频。 ,核心关键词: 1. Simulink 2. 永磁风机 3. 飞轮储能 4. 二次调频 5. 系统频率特性 6. 调频参数 7. 改善频率 8. 参考文献 9. 两区域系统 以上关键词用分号(;)分隔,结果为:Simulink;永磁风机;飞轮储能;二次调频;系统频率特性;调频参数;改善频率;参考文献;两区域系统。,基于Simulink的永磁风机与飞轮储能系统二次调频研究:频率特性及调频参数优化

    MATLAB驱动的ASR防滑转模型:PID与对照控制算法对比,冰雪路面条件下滑移率与车速轮速对照展示,MATLAB驱动的ASR防滑转模型:PID与对照控制算法对比,冰雪路面条件下滑移率与车速轮速对照图

    MATLAB驱动的ASR防滑转模型:PID与对照控制算法对比,冰雪路面条件下滑移率与车速轮速对照展示,MATLAB驱动的ASR防滑转模型:PID与对照控制算法对比,冰雪路面条件下滑移率与车速轮速对照图展示,MATLAB驱动防滑转模型ASR模型 ASR模型驱动防滑转模型 ?牵引力控制系统模型 选择PID控制算法以及对照控制算法,共两种控制算法,可进行选择。 选择冰路面以及雪路面,共两种路面条件,可进行选择。 控制目标为滑移率0.2,出图显示车速以及轮速对照,出图显示车辆轮胎滑移率。 模型简单,仅供参考。 ,MATLAB; ASR模型; 防滑转模型; 牵引力控制系统模型; PID控制算法; 对照控制算法; 冰路面; 雪路面; 控制目标; 滑移率; 车速; 轮速。,MATLAB驱动的ASR模型:PID与对照算法在冰雪路面的滑移率控制研究

    芯片失效分析方法介绍 -深入解析芯片故障原因及预防措施.pptx

    芯片失效分析方法介绍 -深入解析芯片故障原因及预防措施.pptx

    4131_127989170.html

    4131_127989170.html

    PostgreSQL自动化部署与优化脚本:智能化安装、安全加固与监控集成

    内容概要:本文提供了一个全面的PostgreSQL自动化部署解决方案,涵盖智能环境适应、多平台支持、内存与性能优化以及安全性加强等重要方面。首先介绍了脚本的功能及其调用方法,随后详细阐述了操作系统和依赖软件包的准备过程、配置项的自动生成机制,还包括对实例的安全性和监控功能的强化措施。部署指南给出了具体的命令操作指导,便于新手理解和执行。最后强调了该工具对于不同硬件条件和服务需求的有效应对能力,特别是针对云计算环境下应用的支持特点。 适合人群:对PostgreSQL集群运维有一定基础并渴望提高效率和安全性的数据库管理员及工程师。 使用场景及目标:本脚本能够帮助企业在大规模部署时减少人工介入时间,确保系统的稳定性与高性能,适用于各类需要稳定可靠的数据库解决方案的企业或机构,特别是在大数据量和高并发事务处理场合。 其他说明:文中还提及了一些高级功能如自动备份、流复制等设置步骤,使得该方案不仅可以快速上线而且能满足后续维护和发展阶段的要求。同时提到的技术性能数据也为用户评估其能否满足业务需求提供了直观参考。

    房地产开发合同[示范文本].doc

    房地产开发合同[示范文本].doc

    成本优化实战:DeepSeekAPI的Tokens计算与计费策略拆解.pdf

    在日常的工作和学习中,你是否常常为处理复杂的数据、生成高质量的文本或者进行精准的图像识别而烦恼?DeepSeek 或许就是你一直在寻找的解决方案!它以其高效、智能的特点,在各个行业都展现出了巨大的应用价值。然而,想要充分发挥 DeepSeek 的优势,掌握从入门到精通的知识和技能至关重要。本文将从实际应用的角度出发,为你详细介绍 DeepSeek 的基本原理、操作方法以及高级技巧。通过系统的学习,你将能够轻松地运用 DeepSeek 解决实际问题,提升工作效率和质量,让自己在职场和学术领域脱颖而出。现在,就让我们一起开启这场实用又高效的学习之旅吧!

    安全必读:DeepSeek接口调用中的数据加密与合规实践.pdf

    在日常的工作和学习中,你是否常常为处理复杂的数据、生成高质量的文本或者进行精准的图像识别而烦恼?DeepSeek 或许就是你一直在寻找的解决方案!它以其高效、智能的特点,在各个行业都展现出了巨大的应用价值。然而,想要充分发挥 DeepSeek 的优势,掌握从入门到精通的知识和技能至关重要。本文将从实际应用的角度出发,为你详细介绍 DeepSeek 的基本原理、操作方法以及高级技巧。通过系统的学习,你将能够轻松地运用 DeepSeek 解决实际问题,提升工作效率和质量,让自己在职场和学术领域脱颖而出。现在,就让我们一起开启这场实用又高效的学习之旅吧!

Global site tag (gtag.js) - Google Analytics