Mybatis使用foreach報錯Parameter XXXXXX not found. Available parameters are [collection, list]

Mybatis使用foreach報錯:

org.apache.ibatis.binding.BindingException: Parameter 'busiOrderNoList' not found. Available parameters are [collection, list]

 mapper.java類如下

public List<PayrollTradenoPay2CDTO> findTradeInfoForBusiOrderId(List<String> busiOrderNoList);

mapper.xml如下:使用了foreach

       <if test="busiOrderNoList!=null ">
            and pt.busi_order_no in
            <foreach item="item" index="index" collection="busiOrderNoList" open="(" separator="," close=")">
                #{item}
            </foreach>
        </if>

這裏報錯是找不到參數"busiOrderNoList",看來mapper.java的參數並沒傳進來.

默認情況下(沒有指定parameterType時),Mybatis把參數按順序轉化爲#{0},#{1}或者#{param0}#{param1}有以下三種情況

(1)當只有一個參數時,並且沒有參數中沒有if判斷時,可以指定參數#{aaa}或者#{0}或者隨便#{xxxx}都可以獲取值.

(2)當有兩個以上參數時,並且沒有參數中沒有if判斷時.指定參數名#{aaa}#{bbb}或者#{0}#{1}獲取不到值,報錯

Parameter '0' not found. Available parameters are [arg1, arg0, param1, param2],按照提示替換爲#{arg0}#{arg1}或者#{param0}#{param1}就可以了.

(3)當有if時,只能用默認的參數名#{arg0}#{arg1}或者#{param0}#{param1}.如果不想用默認的,只能加@Param指定參數名.

當前問題有兩種解決方式:

1.按照報錯提示,將xml裏的參數busiOrderNoList改爲list或者collection

<if test="list!=null ">
            and pt.busi_order_no in
            <foreach item="item" index="index" collection="list" open="(" separator="," close=")">
                #{item}
            </foreach>
</if>

2. 在mapper.java中添加@Param("busiOrderNoList")註解.如下..

public List<PayrollTradenoPay2CDTO> findTradeInfoForBusiOrderId(@Param("busiOrderNoList") List<String> busiOrderNoList);

Mybatis的參數綁定用法有好幾種.下面介紹常用的3種.

  1. 使用對象傳遞參數.適用於參數比較多.xml需要指定parameterType

    //mapper.java
    
    List<BizProcessDataEntity> findFinishTaskList(ProcessTaskQueryParam processTaskQueryParam);
    
    //mapper.xml 此時需要指定參數類型.比如(parameterType="com.ali.dto.param.ProcessTaskQueryParam" )
    #{map裏的key}


     

  2. 使用@Param傳遞參數.適用於單個參數,或者少數幾個參數.不必指定parameterType

public List<PayrollTradenoPay2CDTO> findTradeInfoForBusiOrderId(@Param("busiOrderNoList") List<String> busiOrderNoList);

 這裏有個注意點.@Param相當於給參數指定了參數名.所以xml裏面必須使用指定的名字,按名字匹配參數.和其它兩種不一樣,可以不必指定parameterType

3.使用map傳遞參數.比如 Map<String, Object> queryMap,map的value可以是任何類型.比如List.xml需要指定parameterType

//mapper.java
List<BizProcessDataEntity> findDistinctNameList(Map map);

//mapper.xml 此時需要指定參數類型爲map.(parameterType="java.util.Map")
#{map裏的key}

 


----------------------------------------------如有疑問,歡迎留言.------------------------------------------------


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章