记录使用mybatis 「foreach」中 index一个坑

在使用mybatis的<foreach>标签时,尝试将index作为SQL语句中的字段,发现所有循环中的index值都为最后一个循环的值。解决办法是将#{}替换为${},从而使index正确显示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本意是想用mybatis <foreach>中 index作为mysql语句中select的一个字段,但是最后生成mysql语句这个所有循环中的index值都是foreach循环最后一次时对应的个值。例子如下:

<select id="hourSpaceInfo" resultType="com.jieshun.jpark.business.entity.api.HourSpaceDTO">
      <foreach collection="hourList" item="ite" open="" separator="union" close="" index="ind">
           SELECT
             #{ind} hour,
            rest_space spaceCount
        FROM
            table_eg
        WHERE
            park_code = #{parkCode}
        AND stats_date = #{date}
      </foreach>
  </select>

这个hourList长度为24,index正常应该是0开始,23结束,理想中结果应该是:

SELECT
             0 hour,
            rest_space spaceCount
        FROM
            table_eg
        WHERE
            park_code = 'parkCode'
        AND stats_date ='date'

union

SELECT
             1 hour,
            rest_space spaceCount
        FROM
            table_eg
        WHERE
            park_code = 'parkCode'
        AND stats_date ='date'

...

 

结果最终的sql语句中,#{ind}这个取值在每个循环中都取到了23,所以最后实际结果是:

SELECT
             23 hour,
            rest_space spaceCount
        FROM
            table_eg
        WHERE
            park_code = 'parkCode'
        AND stats_date ='date'

union

SELECT
             23 hour,
            rest_space spaceCount
        FROM
            table_eg
        WHERE
            park_code = 'parkCode'
        AND stats_date ='date'

...

最后考虑可能#{}的问题,mybatis中针对index标签的取值将#{}改为${},结果正常了,即改成

<select id="hourSpaceInfo" resultType="com.jieshun.jpark.business.entity.api.HourSpaceDTO">
      <foreach collection="hourList" item="ite" open="" separator="union" close="" index="ind">
           SELECT
             ${ind} hour,
            rest_space spaceCount
        FROM
            table_eg
        WHERE
            park_code = #{parkCode}
        AND stats_date = #{date}
      </foreach>
  </select>

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值