mybatis foreach多次遍歷問題:
使用MyBatis foreach循環(huán)的時候出現(xiàn)了個問題根蟹,第一次循環(huán)使用的變量 第二次再次循環(huán)使用的時候 出現(xiàn)了報錯
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
看到這個問題 大概能想到的就是值 被改變了 我就納悶了一會 我在代碼都沒有調(diào)用啊。然后我去查了下資料靶衍,看了下源碼調(diào)試了一下
這是我本身寫的foreach循環(huán)
源碼在 ExpressionEvaluator.java中的evaluateIterable
方法:
此時我foreach 要循環(huán)的collection 是 status 看到的值是一個數(shù)組
到這里是第一個foreach 是完全沒有任何問題的柏腻,第二個foreach 是直接copy第一個foreach的
然后調(diào)試發(fā)現(xiàn)多跑了一個status出來
此時的status 既不是一個數(shù)組也不是一個集合 所以拋出了異常
MyBatis底層的實現(xiàn)是foreach 里面的 item 作為每次循環(huán)的一個標(biāo)記變量坡氯,我這里item 和 collection都重復(fù)了就導(dǎo)致了這個問題
解決辦法就是item 換一個變量名 ,盡量不要和collection 變量名重復(fù)就行了