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

 

 在使用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的类型转换函数将其强制转换。修改查询语句如下:


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

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值