mybatis报错:org.apache.ibatis.reflection.ReflectionException

1 篇文章 0 订阅
1 篇文章 0 订阅

在开发中遇到一个比较奇葩的问题,实体类ClmVisitInfo 中没有属性nSocialGiveAmount,但是在用mybatis时,mapper文件中关于数据库的更新语句中,有以下定义:

<if test="nSocialGiveAmount != null" >
        N_SOCIAL_GIVE_AMOUNT = #{nSocialGiveAmount,jdbcType=DECIMAL},
      </if>

所传参数是:

parameterType="com.insuresmart.claimconf.common.model.ClmVisitInfo"

在本地环境是通过的,在test环境也是OK的,但是在SIT环境时就会报错:

Caused by: org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'nSocialGiveAmount' in 'class com.insuresmart.claimconf.common.model.ClmVisitInfo'
	at org.apache.ibatis.reflection.Reflector.getGetInvoker(Reflector.java:419)
	at org.apache.ibatis.reflection.MetaClass.getGetInvoker(MetaClass.java:164)
	at org.apache.ibatis.reflection.wrapper.BeanWrapper.getBeanProperty(BeanWrapper.java:162)
	at org.apache.ibatis.reflection.wrapper.BeanWrapper.get(BeanWrapper.java:49)
	at org.apache.ibatis.reflection.MetaObject.getValue(MetaObject.java:122)
	at org.apache.ibatis.scripting.xmltags.DynamicContext$ContextMap.get(DynamicContext.java:94)
	at org.apache.ibatis.scripting.xmltags.DynamicContext$ContextAccessor.getProperty(DynamicContext.java:108)
	at org.apache.ibatis.ognl.OgnlRuntime.getProperty(OgnlRuntime.java:2671)
	at org.apache.ibatis.ognl.ASTProperty.getValueBody(ASTProperty.java:114)
	at org.apache.ibatis.ognl.SimpleNode.evaluateGetValueBody(SimpleNode.java:212)
	at org.apache.ibatis.ognl.SimpleNode.getValue(SimpleNode.java:258)
	at org.apache.ibatis.ognl.ASTNotEq.getValueBody(ASTNotEq.java:50)
	at org.apache.ibatis.ognl.SimpleNode.evaluateGetValueBody(SimpleNode.java:212)
	at org.apache.ibatis.ognl.SimpleNode.getValue(SimpleNode.java:258)
	at org.apache.ibatis.ognl.Ognl.getValue(Ognl.java:470)
	at org.apache.ibatis.ognl.Ognl.getValue(Ognl.java:434)
	at org.apache.ibatis.scripting.xmltags.OgnlCache.getValue(OgnlCache.java:44)
	at org.apache.ibatis.scripting.xmltags.ExpressionEvaluator.evaluateBoolean(ExpressionEvaluator.java:32)
	at org.apache.ibatis.scripting.xmltags.IfSqlNode.apply(IfSqlNode.java:34)
	at org.apache.ibatis.scripting.xmltags.MixedSqlNode.apply(MixedSqlNode.java:33)
	at org.apache.ibatis.scripting.xmltags.TrimSqlNode.apply(TrimSqlNode.java:55)
	at org.apache.ibatis.scripting.xmltags.MixedSqlNode.apply(MixedSqlNode.java:33)
	at org.apache.ibatis.scripting.xmltags.DynamicSqlSource.getBoundSql(DynamicSqlSource.java:41)
	at org.apache.ibatis.mapping.MappedStatement.getBoundSql(MappedStatement.java:292)
	at org.apache.ibatis.executor.statement.BaseStatementHandler.<init>(BaseStatementHandler.java:64)
	at org.apache.ibatis.executor.statement.PreparedStatementHandler.<init>(PreparedStatementHandler.java:40)
	at org.apache.ibatis.executor.statement.RoutingStatementHandler.<init>(RoutingStatementHandler.java:46)
	at org.apache.ibatis.session.Configuration.newStatementHandler(Configuration.java:558)
	at org.apache.ibatis.executor.SimpleExecutor.doUpdate(SimpleExecutor.java:48)
	at org.apache.ibatis.executor.BaseExecutor.update(BaseExecutor.java:117)
	at org.apache.ibatis.executor.CachingExecutor.update(CachingExecutor.java:76)
	at sun.reflect.GeneratedMethodAccessor364.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)

出现这个报错的原因是实体类中没有这个属性,但是为什么在环境上同样的代码会产生不同的效果?

我进入了误区,以为各个版本上的代码有所差异,经过对比之后,是完全相同的。、

后来发现,在本地环境、test环境进行更新操作的时候,都是因为数据库表中没有该条数据,所以能够操作成功,
但是在sit环境上更新时有这条记录,就会执行报错。(不同环境产生的数据不相同,是因为业务导致的)。

由此可以引出,在mybatis中mapper所执行的update的语句,在数据库中没有这条记录的时候,sql更新语句中如果出现属性不属于作为参数实体类的属性时,也是上面的这种情况,属性nSocialGiveAmount,在参数实体类ClmVisitInfo 中不含有,但是mapper定义的sql语句中有这个属性,所要更新的表中没有满足执行条件数据,那会执行成功。如果有满足执行条件的数据,那就会更新失败。

引以为戒,在测试mapper中sql语句操作时,最好是数据库中有满足条件的SQL语句!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值