【问题标题】:MyBatis iterate hashmap with foreachMyBatis 使用 foreach 迭代 hashmap
【发布时间】:2013-09-04 10:05:46
【问题描述】:

MyBatis 有一个小问题。我正在尝试遍历 Hashmap,但似乎 MyBatis 无法做到这一点。 Hshmap 的名称是 serviceMap。 MyBatis foreach 的代码如下:

<foreach item="item" index="key" collection="serviceMap"  open="(" separator="or" close=")">
                (upper(p.ENDPOINT) like upper(#{key})
                and
                upper(p.ENDPOINT_OPERATION) like upper(#item))
</foreach>

例外是:

org.apache.ibatis.builder.BuilderException: Error evaluating expression 'serviceMap'. Return value ({vehicle=register}) was not iterable.
at org.apache.ibatis.builder.xml.dynamic.ExpressionEvaluator.evaluateIterable(ExpressionEvaluator.java:59)
at org.apache.ibatis.builder.xml.dynamic.ForEachSqlNode.apply(ForEachSqlNode.java:51)
at org.apache.ibatis.builder.xml.dynamic.MixedSqlNode.apply(MixedSqlNode.java:29)
at org.apache.ibatis.builder.xml.dynamic.IfSqlNode.apply(IfSqlNode.java:31)
at org.apache.ibatis.builder.xml.dynamic.MixedSqlNode.apply(MixedSqlNode.java:29)

是 MyBatis 根本做不到还是我做错了?

如果有人可以帮助我,那就太好了。

非常感谢! 斯蒂芬

【问题讨论】:

标签: mybatis


【解决方案1】:

HashMap 是不可迭代的。 You need to iterate the entrySet.

<foreach item="item" index="key" collection="serviceMap.entrySet"  open="(" separator="or" close=")">
            (upper(p.ENDPOINT) like upper(#{key})
            and
            upper(p.ENDPOINT_OPERATION) like upper(#item))

【讨论】:

【解决方案2】:
<foreach item="item" index="key" collection="serviceMap.entrySet()" open="((" separator="),(" close="))">
                (upper(p.ENDPOINT) like upper(#{item.key})
                and
                upper(p.ENDPOINT_OPERATION) like upper(#item.value))
</foreach>

使用精确的 hashmap 机制

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-03
    • 1970-01-01
    • 2013-11-19
    • 2012-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多