I am using iBatis 2.1.0.565 with JDK 1.5.0. I am trying to pass a List to a sqlmap and then use it to generate a list of comma-separated values for the IN clause of a query, like this:
<resultMap id="counts" class="map"> <result property="id" column="id" javaType="long"/> <result property="count" column="count" javaType="int"/> </resultMap> <select id="findCountsBySession" parameterClass="list" resultMap="counts"> SELECT session_id as id, count(*) count FROM events <dynamic prepend="WHERE"> <iterate property="value" open="(" close=")" conjunction=","> </iterate> session_id IN #value[]# </dynamic> GROUP BY session_id </select> The query I would like to end up with is: SELECT session_id, count(*) count FROM events WHERE session_id IN (1,2,3) GROUP BY session_id But instead I get an exception. Can you not use #value[]#? Here is the exception: java.lang.StringIndexOutOfBoundsException: String index out of range: -2 at java.lang.String.substring(String.java:1768) at com.ibatis.common.beans.GenericProbe.getObject(GenericProbe.java:55) at com.ibatis.sqlmap.engine.mapping.sql.dynamic.elements.IterateTagHandler.doStartFragment(IterateTagHandler.java:34) at com.ibatis.sqlmap.engine.mapping.sql.dynamic.DynamicSql.processBodyChildren(DynamicSql.java:129) at com.ibatis.sqlmap.engine.mapping.sql.dynamic.DynamicSql.processBodyChildren(DynamicSql.java:132) at com.ibatis.sqlmap.engine.mapping.sql.dynamic.DynamicSql.processBodyChildren(DynamicSql.java:99) at com.ibatis.sqlmap.engine.mapping.sql.dynamic.DynamicSql.process(DynamicSql.java:79) at com.ibatis.sqlmap.engine.mapping.sql.dynamic.DynamicSql.getParameterMap(DynamicSql.java:61) at com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryWithCallback(GeneralStatement.java:152) at com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryForList(GeneralStatement.java:119) at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForList(SqlMapExecutorDelegate.java:610) at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForList(SqlMapExecutorDelegate.java:584) at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForMap(SqlMapExecutorDelegate.java:700) at com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.queryForMap(SqlMapSessionImpl.java:121) at com.ibatis.sqlmap.engine.impl.SqlMapClientImpl.queryForMap(SqlMapClientImpl.java:93)