sarians
sarians

Reputation: 31

MyBatis iterate hashmap with foreach

I have a small problem with MyBatis. I'm trying to iterate over a Hashmap but it seems, that MyBatis is not able to do it. The name of the Hshmap is serviceMap. Here is the code of the 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>

The exception is:

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)

Is MyBatis simply not able to do it or did I make an mistake?

It would be really nice, if anybody can help me.

Thanks a lot! Stefan

Upvotes: 0

Views: 9541

Answers (2)

user8079112
user8079112

Reputation:

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

Use the exact hashmap mechanism

Upvotes: 0

Brian
Brian

Reputation: 461

A HashMap is not iterable. 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))

Upvotes: 2

Related Questions