在开发中遇到一个比较奇葩的问题,实体类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语句!!!