Iterate through HashMap with foreach

863 views
Skip to first unread message

Christoph Manig

unread,
Sep 4, 2013, 6:11:41 AM9/4/13
to mybati...@googlegroups.com
Hello,

I want to iterate through a HashMap<String, String> with MyBatis. This map is member of a Java-Class. Here is the code for my 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>

When I run myapplication I get this Error:

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)

at org.apache.ibatis.builder.xml.dynamic.DynamicSqlSource.getBoundSql(DynamicSqlSource.java:37)

at org.apache.ibatis.mapping.MappedStatement.getBoundSql(MappedStatement.java:241)

at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:79)

at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:101)

at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:95)

at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:59)

at java.lang.reflect.Method.invoke(Method.java:601)

at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:355)

at com.sun.proxy.$Proxy61.selectOne(Unknown Source)

at org.mybatis.spring.SqlSessionTemplate.selectOne(SqlSessionTemplate.java:160)

at com.t_systems.smw.console.backend.ConsoleDataManageableImpl.getProtocolRowsByFilter(ConsoleDataManageableImpl.java:65)

at java.lang.reflect.Method.invoke(Method.java:601)

at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:309)

at org.springframework.osgi.service.importer.support.internal.aop.ServiceInvoker.doInvoke(ServiceInvoker.java:58)

at org.springframework.osgi.service.importer.support.internal.aop.ServiceInvoker.invoke(ServiceInvoker.java:62)

at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)

at org.springframework.aop.support.DelegatingIntroductionInterceptor.doProceed(DelegatingIntroductionInterceptor.java:131)

at org.springframework.aop.support.DelegatingIntroductionInterceptor.invoke(DelegatingIntroductionInterceptor.java:119)

at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)

at org.springframework.osgi.service.util.internal.aop.ServiceTCCLInterceptor.invokeUnprivileged(ServiceTCCLInterceptor.java:56)

at org.springframework.osgi.service.util.internal.aop.ServiceTCCLInterceptor.invoke(ServiceTCCLInterceptor.java:39)

at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)

at org.springframework.osgi.service.importer.support.LocalBundleContextAdvice.invoke(LocalBundleContextAdvice.java:59)

at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)

at org.springframework.aop.support.DelegatingIntroductionInterceptor.doProceed(DelegatingIntroductionInterceptor.java:131)

at org.springframework.aop.support.DelegatingIntroductionInterceptor.invoke(DelegatingIntroductionInterceptor.java:119)

at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)

at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)

at com.sun.proxy.$Proxy68.getProtocolRowsByFilter(Unknown Source)

at smw.console.frontend.handler.ConsoleDataHandlerImpl.queryProtocolRowsByFilter(ConsoleDataHandlerImpl.java:76)

at smw.console.frontend.components.CustomIndicatingAjaxButtonProtocol.onSubmit(CustomIndicatingAjaxButtonProtocol.java:40)

at org.apache.wicket.ajax.markup.html.form.AjaxButton$1.onSubmit(AjaxButton.java:108)

at org.apache.wicket.ajax.form.AjaxFormSubmitBehavior$1.onSubmit(AjaxFormSubmitBehavior.java:179)

at org.apache.wicket.markup.html.form.Form.delegateSubmit(Form.java:1235)

at org.apache.wicket.markup.html.form.Form.process(Form.java:921)

at org.apache.wicket.markup.html.form.Form.onFormSubmitted(Form.java:767)

at org.apache.wicket.ajax.form.AjaxFormSubmitBehavior.onEvent(AjaxFormSubmitBehavior.java:156)

at org.apache.wicket.ajax.AjaxEventBehavior.respond(AjaxEventBehavior.java:131)

at org.apache.wicket.ajax.AbstractDefaultAjaxBehavior.onRequest(AbstractDefaultAjaxBehavior.java:603)

at java.lang.reflect.Method.invoke(Method.java:601)

at org.apache.wicket.RequestListenerInterface.internalInvoke(RequestListenerInterface.java:258)

at org.apache.wicket.RequestListenerInterface.invoke(RequestListenerInterface.java:241)

at org.apache.wicket.core.request.handler.ListenerInterfaceRequestHandler.invokeListener(ListenerInterfaceRequestHandler.java:247)

at org.apache.wicket.core.request.handler.ListenerInterfaceRequestHandler.respond(ListenerInterfaceRequestHandler.java:226)

at org.apache.wicket.request.cycle.RequestCycle$HandlerExecutor.respond(RequestCycle.java:840)

at org.apache.wicket.request.RequestHandlerStack.execute(RequestHandlerStack.java:64)

at org.apache.wicket.request.cycle.RequestCycle.execute(RequestCycle.java:254)

at org.apache.wicket.request.cycle.RequestCycle.processRequest(RequestCycle.java:211)

at org.apache.wicket.request.cycle.RequestCycle.processRequestAndDetach(RequestCycle.java:282)

at org.apache.wicket.protocol.http.WicketFilter.processRequestCycle(WicketFilter.java:244)

at org.apache.wicket.protocol.http.WicketFilter.processRequest(WicketFilter.java:188)

at org.apache.wicket.protocol.http.WicketServlet.doPost(WicketServlet.java:159)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:713)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:806)

at org.ops4j.pax.wicket.internal.FilterDelegator$Chain.doFilter(FilterDelegator.java:80)

at org.ops4j.pax.wicket.internal.FilterDelegator.doFilter(FilterDelegator.java:62)

at org.ops4j.pax.wicket.internal.ServletProxy$ServletInvocationHandler.invoke(ServletProxy.java:72)

at com.sun.proxy.$Proxy75.service(Unknown Source)

at java.lang.reflect.Method.invoke(Method.java:601)

at org.ops4j.pax.web.service.internal.HttpServiceStarted$1.invoke(HttpServiceStarted.java:182)

at org.ops4j.pax.web.service.internal.$Proxy52.service(Unknown Source)

at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:652)

at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:447)

at org.ops4j.pax.web.service.jetty.internal.HttpServiceServletHandler.doHandle(HttpServiceServletHandler.java:70)

at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137)

at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:534)

at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:227)

at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1038)

at org.ops4j.pax.web.service.jetty.internal.HttpServiceContext.doHandle(HttpServiceContext.java:117)

at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:374)

at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:189)

at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:972)

at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)

at org.ops4j.pax.web.service.jetty.internal.JettyServerHandlerCollection.handle(JettyServerHandlerCollection.java:75)

at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116)

at org.eclipse.jetty.server.Server.handle(Server.java:363)

at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:483)

at org.eclipse.jetty.server.AbstractHttpConnection.content(AbstractHttpConnection.java:931)

at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.content(AbstractHttpConnection.java:992)

at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:856)

at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:240)

at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82)

at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:627)

at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:51)

at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608)

at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543)

at java.lang.Thread.run(Thread.java:722)

 

Complete stack:

 

org.apache.wicket.WicketRuntimeException: Method onRequest of interface org.apache.wicket.behavior.IBehaviorListener targeted at org.apache.wicket.ajax.markup.html.form.AjaxButton$1@a0a8f63 on component [CustomIndicatingAjaxButtonProtocol [Component id = submit]] threw an exception

at org.apache.wicket.RequestListenerInterface.internalInvoke(RequestListenerInterface.java:268)

at org.apache.wicket.RequestListenerInterface.invoke(RequestListenerInterface.java:241)

at org.apache.wicket.core.request.handler.ListenerInterfaceRequestHandler.invokeListener(ListenerInterfaceRequestHandler.java:247)

at org.apache.wicket.core.request.handler.ListenerInterfaceRequestHandler.respond(ListenerInterfaceRequestHandler.java:226)

at org.apache.wicket.request.cycle.RequestCycle$HandlerExecutor.respond(RequestCycle.java:840)

at org.apache.wicket.request.RequestHandlerStack.execute(RequestHandlerStack.java:64)

at org.apache.wicket.request.cycle.RequestCycle.execute(RequestCycle.java:254)

at org.apache.wicket.request.cycle.RequestCycle.processRequest(RequestCycle.java:211)

at org.apache.wicket.request.cycle.RequestCycle.processRequestAndDetach(RequestCycle.java:282)

at org.apache.wicket.protocol.http.WicketFilter.processRequestCycle(WicketFilter.java:244)

 

java.lang.reflect.InvocationTargetException

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)

at java.lang.reflect.Method.invoke(Method.java:601)

at org.apache.wicket.RequestListenerInterface.internalInvoke(RequestListenerInterface.java:258)

at org.apache.wicket.RequestListenerInterface.invoke(RequestListenerInterface.java:241)

at org.apache.wicket.core.request.handler.ListenerInterfaceRequestHandler.invokeListener(ListenerInterfaceRequestHandler.java:247)

at org.apache.wicket.core.request.handler.ListenerInterfaceRequestHandler.respond(ListenerInterfaceRequestHandler.java:226)

at org.apache.wicket.request.cycle.RequestCycle$HandlerExecutor.respond(RequestCycle.java:840)

at org.apache.wicket.request.RequestHandlerStack.execute(RequestHandlerStack.java:64)

at org.apache.wicket.request.cycle.RequestCycle.execute(RequestCycle.java:254)

at org.apache.wicket.request.cycle.RequestCycle.processRequest(RequestCycle.java:211)

at org.apache.wicket.request.cycle.RequestCycle.processRequestAndDetach(RequestCycle.java:282)

at org.apache.wicket.protocol.http.WicketFilter.processRequestCycle(WicketFilter.java:244)

 

org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.builder.BuilderException: Error evaluating expression 'serviceMap'. Return value ({vehicle=register}) was not iterable.

at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:73)

at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:365)

at com.sun.proxy.$Proxy61.selectOne(Unknown Source)

at org.mybatis.spring.SqlSessionTemplate.selectOne(SqlSessionTemplate.java:160)

at com.t_systems.smw.console.backend.ConsoleDataManageableImpl.getProtocolRowsByFilter(ConsoleDataManageableImpl.java:65)

at java.lang.reflect.Method.invoke(Method.java:601)

at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:309)

at org.springframework.osgi.service.importer.support.internal.aop.ServiceInvoker.doInvoke(ServiceInvoker.java:58)

at org.springframework.osgi.service.importer.support.internal.aop.ServiceInvoker.invoke(ServiceInvoker.java:62)

at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)

at org.springframework.aop.support.DelegatingIntroductionInterceptor.doProceed(DelegatingIntroductionInterceptor.java:131)

at org.springframework.aop.support.DelegatingIntroductionInterceptor.invoke(DelegatingIntroductionInterceptor.java:119)

at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)

at org.springframework.osgi.service.util.internal.aop.ServiceTCCLInterceptor.invokeUnprivileged(ServiceTCCLInterceptor.java:56)

at org.springframework.osgi.service.util.internal.aop.ServiceTCCLInterceptor.invoke(ServiceTCCLInterceptor.java:39)

at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)

at org.springframework.osgi.service.importer.support.LocalBundleContextAdvice.invoke(LocalBundleContextAdvice.java:59)

at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)

at org.springframework.aop.support.DelegatingIntroductionInterceptor.doProceed(DelegatingIntroductionInterceptor.java:131)

at org.springframework.aop.support.DelegatingIntroductionInterceptor.invoke(DelegatingIntroductionInterceptor.java:119)

at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)

at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)

at com.sun.proxy.$Proxy68.getProtocolRowsByFilter(Unknown Source)

at smw.console.frontend.handler.ConsoleDataHandlerImpl.queryProtocolRowsByFilter(ConsoleDataHandlerImpl.java:76)

at smw.console.frontend.components.CustomIndicatingAjaxButtonProtocol.onSubmit(CustomIndicatingAjaxButtonProtocol.java:40)

at org.apache.wicket.ajax.markup.html.form.AjaxButton$1.onSubmit(AjaxButton.java:108)

at org.apache.wicket.ajax.form.AjaxFormSubmitBehavior$1.onSubmit(AjaxFormSubmitBehavior.java:179)

at org.apache.wicket.markup.html.form.Form.delegateSubmit(Form.java:1235)

at org.apache.wicket.markup.html.form.Form.process(Form.java:921)

at org.apache.wicket.markup.html.form.Form.onFormSubmitted(Form.java:767)

at org.apache.wicket.ajax.form.AjaxFormSubmitBehavior.onEvent(AjaxFormSubmitBehavior.java:156)

at org.apache.wicket.ajax.AjaxEventBehavior.respond(AjaxEventBehavior.java:131)

at org.apache.wicket.ajax.AbstractDefaultAjaxBehavior.onRequest(AbstractDefaultAjaxBehavior.java:603)

at java.lang.reflect.Method.invoke(Method.java:601)

at org.apache.wicket.RequestListenerInterface.internalInvoke(RequestListenerInterface.java:258)

at org.apache.wicket.RequestListenerInterface.invoke(RequestListenerInterface.java:241)

at org.apache.wicket.core.request.handler.ListenerInterfaceRequestHandler.invokeListener(ListenerInterfaceRequestHandler.java:247)

at org.apache.wicket.core.request.handler.ListenerInterfaceRequestHandler.respond(ListenerInterfaceRequestHandler.java:226)

at org.apache.wicket.request.cycle.RequestCycle$HandlerExecutor.respond(RequestCycle.java:840)

at org.apache.wicket.request.RequestHandlerStack.execute(RequestHandlerStack.java:64)

at org.apache.wicket.request.cycle.RequestCycle.execute(RequestCycle.java:254)

at org.apache.wicket.request.cycle.RequestCycle.processRequest(RequestCycle.java:211)

at org.apache.wicket.request.cycle.RequestCycle.processRequestAndDetach(RequestCycle.java:282)

at org.apache.wicket.protocol.http.WicketFilter.processRequestCycle(WicketFilter.java:244)

 

Can anybody help me please?

Christoph

Guy Rouillier

unread,
Sep 4, 2013, 2:38:10 PM9/4/13
to mybati...@googlegroups.com
On 9/4/2013 6:11 AM, Christoph Manig wrote:
> Hello,
>
> I want to iterate through a HashMap<String, String> with MyBatis. This
> map is member of a Java-Class. Here is the code for my 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>
>
> When I run myapplication I get this Error:
>
> org.apache.ibatis.builder.BuilderException: Error evaluating expression
> 'serviceMap'. Return value ({vehicle=register}) was not iterable.

That's correct. Please see MyBatis User's Guide section 5.1.4 foreach.
"You can pass a List instance or an Array to MyBatis as a parameter
object." Look at the Java API reference; HashMap is not a collection,
and is not iterable.

I have found that foreach is more forgiving than advertised. I have
successfully used an EnumSet. But per the Java reference, EnunSet is
iterable.

--
Guy Rouillier
Reply all
Reply to author
Forward
0 new messages