zoukankan      html  css  js  c++  java
  • mybatis foreach多次遍历问题

    mybatis foreach多次遍历问题:

    使用MyBatis foreach循环的时候出现了个问题,第一次循环使用的变量 第二次再次循环使用的时候 出现了报错

      Caused by: org.apache.ibatis.builder.BuilderException: Error evaluating expression 'status'.  Return value (1) was not iterable.
            at org.apache.ibatis.scripting.xmltags.ExpressionEvaluator.evaluateIterable(ExpressionEvaluator.java:65)
        at org.apache.ibatis.scripting.xmltags.ForEachSqlNode.apply(ForEachSqlNode.java:55)
        at org.apache.ibatis.scripting.xmltags.MixedSqlNode.apply(MixedSqlNode.java:33)
        at org.apache.ibatis.scripting.xmltags.IfSqlNode.apply(IfSqlNode.java:35)
        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.IfSqlNode.apply(IfSqlNode.java:35)
        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.IfSqlNode.apply(IfSqlNode.java:35)
        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.CachingExecutor.query(CachingExecutor.java:81)
        at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:148)
        at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:141)
        at sun.reflect.GeneratedMethodAccessor72.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:606)
        at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:434)
          ... 82 more
    

    看到这个问题 大概能想到的就是值 被改变了 我就纳闷了一会 我在代码都没有调用啊。然后我去查了下资料,看了下源码调试了一下

    这是我本身写的foreach循环


    2743275-888da1bdac54d8b2.png
    image.png

    源码在 ExpressionEvaluator.java中的evaluateIterable方法:

    2743275-42d0d8a3c3fe230e.png
    image.png

    此时我foreach 要循环的collection 是 status 看到的值是一个数组


    2743275-1b2d928e9fa6280d.png
    image.png

    到这里是第一个foreach 是完全没有任何问题的,第二个foreach 是直接copy第一个foreach的

    然后调试发现多跑了一个status出来


    2743275-407b92fbde293ae1.png
    image.png

    此时的status 既不是一个数组也不是一个集合 所以抛出了异常

    MyBatis底层的实现是foreach 里面的 item 作为每次循环的一个标记变量,我这里item 和 collection都重复了就导致了这个问题

    解决办法就是item 换一个变量名 ,尽量不要和collection 变量名重复就行了

  • 相关阅读:
    requests
    Unit5 Going places
    Unit1 A time to remember
    SQL:找到一个关于all some any的用法,可在SSMS里看效果
    SQL join小结
    mac 配置tomcat
    oc与java c++语法区别
    swift调用oc项目
    java网络编程之socket
    windows远程控制mac
  • 原文地址:https://www.cnblogs.com/zhousiwei/p/10625760.html
Copyright © 2011-2022 走看看