【解決】【 MyBatis 】使用MyBatis批量增加,出現(xiàn) Parameter '__frch_item_0' not found. Available parameters are [list]
異常信息:
1 java.lang.RuntimeException: org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.binding.BindingException: Parameter '__frch_item_0' not found. Available parameters are [list] 2 org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.binding.BindingException: Parameter '__frch_item_0' not found. Available parameters are [list] 3 at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:73) 4 at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:365)
最終查到導(dǎo)致異常的原因是 foreach中的屬性字段名字寫錯(cuò)了!表字段太多,一個(gè)個(gè)找的還是很費(fèi)勁的!建議這種做好單元測(cè)試!
另外,寫xml的時(shí)差錯(cuò),還可以從下面幾點(diǎn)檢查。
1、parameterType="Java.util.List",這個(gè)parameterType有沒有寫錯(cuò);
2、<foreach collection="list" item="item" index="index" open="" close="" separator=";">這行中,collection是不是List
關(guān)于批量更新做一個(gè)總結(jié):
批量更新有兩種,一種是通過id更新很多字段,第二種是更改一列,值是固定的這種。下面分別貼出列子
例子:
更新一列:
1 <update id="batchUpdateResult" parameterType="java.util.List"> 2 update 3 <include refid="input_invoice_original_record" /> 4 set isGet = 0 where invoiceNum in 5 <foreach collection="list" item="item" open="(" separator="," close=")"> 6 #{item} 7 </foreach> 8 </update>
這種直接是item就行,只是一個(gè)查詢的條件范圍。
更新很多字段:
1 <update id="batchUpdate" parameterType="list"> 2 <foreach collection="list" item="item" index="index" open="" close="" separator=";"> 3 update 4 <include refid="input_invoice_original_record" /> 5 <trim prefix="SET" suffixOverrides=","> 6 <if test="item.title != null"> 7 title = #{item.title}, 8 </if> 9 <if test="item.invoiceNum != null"> 10 invoiceNum = #{item.invoiceNum}, 11 </if> 12 <if test="item.invoiceCode != null"> 13 invoiceCode = #{item.invoiceCode}, 14 </if> 15 <if test="item.invoiceDate != null"> 16 invoiceDate = #{item.invoiceDate}, 17 </if> 18 19 </trim> 20 WHERE id = #{item.id} 21 </foreach> 22 </update> 23
注意,這種傳的是一個(gè)個(gè)的對(duì)象在list集合中,要加item.屬性名稱,空判斷的時(shí)候別忘記這種格式,這里我犯過錯(cuò),沒少費(fèi)時(shí)間。
貼出來當(dāng)時(shí)忘記加item的異常 信息:
1 java.lang.RuntimeException: org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.binding.BindingException: Parameter 'title' not found. Available parameters are [list] 2 org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.binding.BindingException: Parameter 'title' not found. Available parameters are [list] 3 at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:73) 4 at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:365)
找這個(gè)問題用了不少時(shí)間!
下面說一下批量插入操作。
1 <insert id="batchInsert" parameterType="java.util.List" 2 useGeneratedKeys="true" keyProperty="id"> 3 <selectKey resultType="long" keyProperty="id" order="AFTER"> 4 SELECT 5 LAST_INSERT_ID() 6 </selectKey> 7 INSERT INTO 8 <include refid="input_invoice_original_record" /> 9 ( 10 title , 11 invoiceNum, 12 invoiceCode, 13 invoiceDate, 14 sellDate , 15 invoiceCategory 16 ) 17 VALUES 18 <foreach collection="list" item="item" index="index" 19 separator=","> 20 ( 21 #{item.title} , 22 #{item.invoiceNum}, 23 #{item.invoiceCode}, 24 #{item.invoiceDate}, 25 #{item.sellDate} , 26 #{item.invoiceCategory} 27 ) 28 </foreach> 29 </insert>
易錯(cuò)點(diǎn)和批量更新一樣,寫的時(shí)候要仔細(xì)。
這里做一個(gè)總結(jié),如果不正確之處,歡迎指正!
1.查看parameterType的類型是不是Java.util.List類型,如果是的話,看foreach 的collection屬性是不是list,
因?yàn)?傳遞一個(gè) List 實(shí)例或者數(shù)組作為參數(shù)對(duì)象傳給 MyBatis,MyBatis 會(huì)自動(dòng)將它包裝在一個(gè) Map 中,用名稱在作為鍵。List 實(shí)例將會(huì)以“list” 作為鍵,而數(shù)組實(shí)例將會(huì)以“array”作為鍵
2.看一下foreach里面的值有沒有傳遞進(jìn)來
3.看foreach里面的名稱字段是否寫錯(cuò)
4.還有就是我用Mybatis的時(shí)候,用MySQL的值插入自動(dòng)增長(zhǎng)值,里面的key我在數(shù)據(jù)庫(kù)中沒有設(shè)置自動(dòng)增長(zhǎng),然后我又用了selectkey,所以也會(huì)出現(xiàn)這種情況
應(yīng)該還有別的錯(cuò)誤能夠?qū)е逻@個(gè)錯(cuò)誤。但是我就只遇到這幾種。所以做個(gè)總結(jié)
【可用例子】
<!-- createEmergencyBatch:批量插入交接班 - 突發(fā)事件 關(guān)聯(lián)對(duì)象列表 -->
<insert id="createEmergencyBatch" parameterType="java.util.List">
INSERT INTO DUTY_CHANGE_DUTY_EMERGENCY
(ID,EMERGENCY_ID,CHANGE_WORK_DUTY_ID,STATUS,CREATE_TIME)
(
<foreach collection="list" item="item" index="index" separator="union all">
SELECT
#{item.id,jdbcType=VARCHAR},
#{item.emergencyId,jdbcType=VARCHAR},
#{item.changeWorkDutyId,jdbcType=VARCHAR},
#{item.status,jdbcType=VARCHAR},
#{item.createTime,jdbcType=TIMESTAMP}
FROM dual
</foreach>
)
</insert>
梅花香自苦寒來
posted on 2017-05-09 08:09 wen.ding 閱讀(3974) 評(píng)論(0) 編輯 收藏 所屬分類: Exception