Mybatis映射器文件,参数在foreach语句中更改为null

时间:2016-05-13 07:11:04

标签: mybatis ibatis

好的,我正在尝试为Map<String,List<String>>生成sql,我有一个嵌套的foreach语句来生成sql。这是我的mybatis xml映射器文件:

<select id="UserScaleResult.listAccordingToScaleBrief" resultType="java.util.Map">
    select distinct uu.id as uid, uu.fullname, ucn.card_number,
    uu.mobile_number

    from
    <include refid="UserScaleResult.baseCondition.from" />
    <include refid="UserScaleResult.UserType.from"/>
    <include refid="UserScaleResult.listAccordingToScale.from"/>
    <include refid="UserScaleResult.baseConditions.where" />
    <include refid="UserScaleResult.UserType.where" />
    <include refid="UserScaleResult.listAccordingToScale.where" />
    limit #{offset}, #{pageSize}
</select>


<sql id="UserScaleResult.listAccordingToScale.where">
    <if test="@Ognl@isNotEmpty(type)">
        and musr.type = #{type}
    </if>
    <if
        test="@Ognl@isNotEmpty(createTimeBegin) and @Ognl@isNotEmpty(createTimeEnd)">
        and musr.create_time between #{createTimeBegin} and
        #{createTimeEnd};
    </if>
    <if test="@Ognl@isNotEmpty(missionId)">
        and musr.mission_id = #{missionId}
    </if>
    <if test="@Ognl@isNotEmpty(scaleId)">
        and musr.scale_id = #{scaleId}
    </if>
    <if test="@Ognl@isNotEmpty(sdl)">
        and (
        <foreach collection="sdl.entrySet()" item="item" open="(" separator=") or (" close=")">
        tsrdl.dimension_id = #{item.key} 
            <if test="@Ognl@isNotEmpty(item.value)">
                and 
                <foreach collection="item.value" item="iitem" open="(" separator=" or " close=")">
                    tsrdl.level_id = #{iitem}
                </foreach>
            </if>
        </foreach>
        )
    </if>
</sql>

日志显示#{iitem}在将它放到sql时都是null,尽管参数的数量是正确的:

2016-05-13 14:47:27,837 DEBUG [java.sql.Connection] - <==>  Preparing: select count(*) from user_user uu left join user_user_detail uud on uu.id = uud.user_id left join user_card_number ucn on uu.card_number_id =ucn.id left join org_org oo on ucn.org_id = oo.id inner join (SELECT user_id, MAX(IF(extension_item_id=?,DATA,'') )AS ? FROM user_extension_item_data GROUP BY user_id) AS ud on uu.id = ud.user_id inner join mission_user_scale_result musr on uu.id = musr.user_id inner join test_scale ts on musr.scale_id = ts.id inner join test_scale_result_dimension_level tsrdl on tsrdl.result_id = musr.id and ud.3 = ? and ( ( tsrdl.dimension_id = ? and ( tsrdl.level_id = ? or tsrdl.level_id = ? ) ) or ( tsrdl.dimension_id = ? and ( tsrdl.level_id = ? or tsrdl.level_id = ? or tsrdl.level_id = ? ) ) ) >
2016-05-13 14:47:27,838 DEBUG [java.sql.PreparedStatement] - <==> Parameters: 3(String), 3(String), 保密(String), 42(String), null, null, 47(String), null, null, null>

编辑: 刚做了一些实验,当我用'#'替换#{iitem}中的'$'符号时,显示的值和sql获得的参数都很好。

1 个答案:

答案 0 :(得分:1)

我们需要使用${dataBaseTable}代替#。不同之处在于#用于PreparedStatement替换。 $用于直接字符串替换。

#{iitem}替换为${iitem}

....
     <foreach collection="item.value" item="iitem" open="(" separator=" or " close=")">  
         tsrdl.level_id = ${iitem} 
     </foreach>
....