mybatis foreach多次遍历问题:Error evaluating expression ‘’. Return value () was not iterable.

mybatis foreach多次遍历问题:

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


[java] view plain copy
print ?
  1. Caused by: org.apache.ibatis.builder.BuilderException: Error evaluating expression ‘status’.  Return value (1) was not iterable.  
  2.     at org.apache.ibatis.scripting.xmltags.ExpressionEvaluator.evaluateIterable(ExpressionEvaluator.java:65)  
  3.     at org.apache.ibatis.scripting.xmltags.ForEachSqlNode.apply(ForEachSqlNode.java:55)  
  4.     at org.apache.ibatis.scripting.xmltags.MixedSqlNode.apply(MixedSqlNode.java:33)  
  5.     at org.apache.ibatis.scripting.xmltags.IfSqlNode.apply(IfSqlNode.java:35)  
  6.     at org.apache.ibatis.scripting.xmltags.MixedSqlNode.apply(MixedSqlNode.java:33)  
  7.     at org.apache.ibatis.scripting.xmltags.TrimSqlNode.apply(TrimSqlNode.java:55)  
  8.     at org.apache.ibatis.scripting.xmltags.MixedSqlNode.apply(MixedSqlNode.java:33)  
  9.     at org.apache.ibatis.scripting.xmltags.IfSqlNode.apply(IfSqlNode.java:35)  
  10.     at org.apache.ibatis.scripting.xmltags.MixedSqlNode.apply(MixedSqlNode.java:33)  
  11.     at org.apache.ibatis.scripting.xmltags.TrimSqlNode.apply(TrimSqlNode.java:55)  
  12.     at org.apache.ibatis.scripting.xmltags.MixedSqlNode.apply(MixedSqlNode.java:33)  
  13.     at org.apache.ibatis.scripting.xmltags.IfSqlNode.apply(IfSqlNode.java:35)  
  14.     at org.apache.ibatis.scripting.xmltags.MixedSqlNode.apply(MixedSqlNode.java:33)  
  15.     at org.apache.ibatis.scripting.xmltags.DynamicSqlSource.getBoundSql(DynamicSqlSource.java:41)  
  16.     at org.apache.ibatis.mapping.MappedStatement.getBoundSql(MappedStatement.java:292)  
  17.     at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:81)  
  18.     at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:148)  
  19.     at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:141)  
  20.     at sun.reflect.GeneratedMethodAccessor72.invoke(Unknown Source)  
  21.     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)  
  22.     at java.lang.reflect.Method.invoke(Method.java:606)  
  23.     at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:434)  
  24.     … 82 more  
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循环


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

mybatis foreach多次遍历问题:Error evaluating expression ‘’. Return value () was not iterable._第1张图片

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

mybatis foreach多次遍历问题:Error evaluating expression ‘’. Return value () was not iterable._第2张图片

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

然后调试发现多跑了一个status出来mybatis foreach多次遍历问题:Error evaluating expression ‘’. Return value () was not iterable._第3张图片

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

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

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


你可能感兴趣的:(mybatis)