<select id="findCountsBySession" parameterClass="list" resultMap="counts">
   SELECT
     session_id as id, count(*) count
   FROM
     events
   <dynamic prepend="WHERE">
       <iterate property="value" prepend="session_id IN" open="("
close=")" conjunction=",">
         #value[]#
       </iterate>
   </dynamic>
   GROUP BY
     session_id
 </select>

Brandon

On 6/9/05, Paul Barry <[EMAIL PROTECTED]> wrote:
> 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)
>

Reply via email to