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循环


image.png

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

image.png

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


image.png

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

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


image.png

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

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

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

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1. 简介 1.1 什么是 MyBatis ? MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的...
    笨鸟慢飞阅读 11,207评论 0 4
  • 官方文档 简介 入门 XML配置 XML映射文件 动态SQL Java API SQL语句构建器 日志 一、 JD...
    拾壹北阅读 8,864评论 0 52
  • 1、#{}和${}的区别是什么?注:这道题是面试官面试我同事的。 答:${}是Properties文件中的变量占位...
    小沙鹰168阅读 6,602评论 2 64
  • -1- 不怎么相信那些所谓的成功学,甚至连这样的书都懒得去翻。 在简书看到那些大神发来如何通过阅读赚钱的文,我都后...
    莹光灼华阅读 3,975评论 33 20
  • 我有个朋友的孩子,每晚必哭一两个小时,哭的整栋楼都感觉没法好好做邻居了。 朋友说,自打他出生,安静了二十多天后,就...
    迷鹿小姐阅读 4,933评论 4 2

友情链接更多精彩内容