2016-05-13 23 views
0

Okay, ich versuche, sql für eine Map<String,List<String>> zu erzeugen, habe ich eine verschachtelte foreach-Anweisungen zu generieren sql. Das ist mein Mybatis xml-Mapper-Datei:Mybatis-Mapper-Datei, Parameter wurde in foreach-Anweisung auf Null geändert

<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="@[email protected](type)"> 
     and musr.type = #{type} 
    </if> 
    <if 
     test="@[email protected](createTimeBegin) and @[email protected](createTimeEnd)"> 
     and musr.create_time between #{createTimeBegin} and 
     #{createTimeEnd}; 
    </if> 
    <if test="@[email protected](missionId)"> 
     and musr.mission_id = #{missionId} 
    </if> 
    <if test="@[email protected](scaleId)"> 
     and musr.scale_id = #{scaleId} 
    </if> 
    <if test="@[email protected](sdl)"> 
     and (
     <foreach collection="sdl.entrySet()" item="item" open="(" separator=") or (" close=")"> 
     tsrdl.dimension_id = #{item.key} 
      <if test="@[email protected](item.value)"> 
       and 
       <foreach collection="item.value" item="iitem" open="(" separator=" or " close=")"> 
        tsrdl.level_id = #{iitem} 
       </foreach> 
      </if> 
     </foreach> 
     ) 
    </if> 
</sql> 

Das Protokoll zeigt die # {iItem} sind alle null, wenn es zu SQL hinstellen, obwohl die Anzahl der Parameter korrekt sind:

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> 

EDIT : Ich habe nur ein wenig experimentiert, wenn ich die '#' unterschreiben #{iitem} mit '$', erscheint der Wert und die SQL-Parameter erhalten alle gut.

+0

Können Sie alle Ihre ''