码迷,mamicode.com
首页 > Web开发 > 详细

弄了我几个小时的报错org.hibernate.PropertyNotFoundException

时间:2015-04-01 15:30:39      阅读:195      评论:0      收藏:0      [点我收藏+]

标签:oracle   hibernate   java   

 在使用hibernate4.3做Oracle数据查询时,由于是从三表表中提取出来的数据,所以没有对应的实体类对象与之对应,故我才用了DTO(写了一个中间对象,这个对象中含有我要用的对象的属性名和属性类型)。如下图:
 技术分享
Hibernate查询如下:
技术分享
查询方法和语句都没错,可以从数据库中查询出来,如果连的数据库是MySQL、SQL Server2008我想也不会报错,但我连的是Oracle,然而它又偏偏报错了。如果StuInfoDTO是一个数据库对象(在数据库中有对应的表),Oracle也不会报错,可是它偏偏又不是一个数据库对象。我们先来看一下它的报错提示:
技术分享
 它说我没有给STUID提供setter方法,此时我相信大家都会去看类StuInfoDTO,发现提供了setStuid(int stuid)的方法,但为什么Oracle还会报错了????
原因很简单,因为Oracle数据库返回的所有字段名都是大写的,注意看它的报错,它提示的是“STUID”,根据hibernate的反射生产getter、setter的机制,将字段的第一个字符变成大写后在前面加上get或set,如果第一个字符是大写则不做处理。此时我们会发现它判断的是setSTUID()而不是setStuid(),所以它才会提示没有找到STUID的setter方法。但为什么有配置文件的,在数据库中有对应表存在的就不会出错了,那是因为配置文件中的映射关系帮你解决了这个问题。我们将该类的setter方法修改成如下形式:
技术分享
 运行后,报错
技术分享
技术分享 
 由前面报错提示可以看出是int类型的值出错了,也就是我们的stuid属性值,由后面提示可以看出是参数类型不匹配。此时我们又要郁闷了,这个属性我查询的是学生信息表中的学号列,这个列我定义的是int类型啊,而且是自动由序列生产的。既然说类型不匹配,我们就将StuInfoDTO类中的stuid属性类型改为String,如下所示:
技术分享
再次运行时,依然报如上的错误,此时我们只能使用Oracle的类型转换函数将其强制转换。修改查询语句如下:
技术分享

再次运行即可惊奇的发现,结果出来了。

弄了我几个小时的报错org.hibernate.PropertyNotFoundException

标签:oracle   hibernate   java   

原文地址:http://blog.csdn.net/qfxsxhfy/article/details/44806003

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!