弄了我几个小时的报错org.hibernate.PropertyNotFoundException
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的类型转换函数将其强制转换。修改查询语句如下:
再次运行即可惊奇的发现,结果出来了。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。