1.情況限制
此處的錯誤解決方案只討論:
在使用Mybatis時,傳入數組且使用<foreach>標簽時出現此種報錯;
2.報錯案例
mapper.java
/** * @Description: 取消驗廠通知 * SupplierCheckfactoryInformMapper * cancelNotifyToCheckFac * @param params * 2016-8-24 下午3:42:44 */ public void cancelNotifyToCheckFac(
@Param("regId")Integer regId,
@Param("updateDt")Date updateDt,
@Param("supplierIds")BigInteger[] supplierIds
);
mapper.xml
<update id="cancelNotifyToCheckFac"> UPDATE t_supplier_regaccount_info tsri, t_supplier_checkfactory_inform tsci SET status = 2, update_dt = #{updateDt} WHERE tsri.supplier_id = tsci.supplier_id AND tsri.supplier_id in <foreach collection="supplierIds" item="item" index="index" open="(" separator="," close=")"> #{supplierIds} </foreach> AND tsri.reg_id = #{regId} AND tsci.status = 0 </update>
報錯信息:
### Error updating database. Cause: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Truncated incorrect DOUBLE value: '\xAC\xED\x00\x05ur\x00\x17[Ljava.math.BigInteger;\x0E|\xDBF\xE0:`\xC6\x02\x00\x00xp\x00\x00\x00\x01sr\x00\x14java.math.BigIntege'
### The error may involve defaultParameterMap
### The error occurred while setting parameters
### SQL: UPDATE t_supplier_regaccount_info tsri, t_supplier_checkfactory_inform tsci SET status = 2, update_dt = ? WHERE tsri.supplier_id = tsci.supplier_id AND tsri.supplier_id in ( ? ) AND tsri.reg_id = ? AND tsci.status = 0
### Cause: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Truncated incorrect DOUBLE value: '\xAC\xED\x00\x05ur\x00\x17[Ljava.math.BigInteger;\x0E|\xDBF\xE0:`\xC6\x02\x00\x00xp\x00\x00\x00\x01sr\x00\x14java.math.BigIntege'
; SQL []; Data truncation: Truncated incorrect DOUBLE value: '\xAC\xED\x00\x05ur\x00\x17[Ljava.math.BigInteger;\x0E|\xDBF\xE0:`\xC6\x02\x00\x00xp\x00\x00\x00\x01sr\x00\x14java.math.BigIntege'; nested exception is com.mysql.jdbc.MysqlDataTruncation: Data truncation: Truncated incorrect DOUBLE value: '\xAC\xED\x00\x05ur\x00\x17[Ljava.math.BigInteger;\x0E|\xDBF\xE0:`\xC6\x02\x00\x00xp\x00\x00\x00\x01sr\x00\x14java.math.BigIntege'
ERROR 2016-09-18 15:03:17,661 util.web.ExceptionAdvisor: 內部/外部請求人:/admin
ERROR 2016-09-18 15:03:17,661 util.web.ExceptionAdvisor: 請求IP:0:0:0:0:0:0:0:1
ERROR 2016-09-18 15:03:17,662 util.web.ExceptionAdvisor: 請求參數:{supplierId=26};
ERROR 2016-09-18 15:03:17,662 util.web.ExceptionAdvisor: =====service通知結束,繼續向上拋BusinessException=====
WARN 2016-09-18 15:03:17,669 org.springframework.web.servlet.handler.AbstractHandlerExceptionResolver: Handler execution resulted in exception
common.model.BusinessException: 抱歉,程序內部錯誤,操作失敗! 請稍后再試或與管理員聯系!
3.錯誤分析
此處的報錯信息:Data truncation: Truncated incorrect DOUBLE value
3.1:在網上的主要錯誤原因是:update語句中的set中出現了and關鍵字,而應該使用逗號<,>代替之;這里的報錯不屬於這種情況;
3.2:此處錯誤原因為:<foreach>標簽中不能使用參數名#{supplierIds},而應該使用#{item},貌似為固定寫法;根本原因尚不明確,待大神指點;
4.代碼修改后
mapper.xml
<update id="cancelNotifyToCheckFac"> UPDATE t_supplier_regaccount_info tsri, t_supplier_checkfactory_inform tsci SET status = 2, update_dt = #{updateDt} WHERE tsri.supplier_id = tsci.supplier_id AND tsri.supplier_id in <foreach collection="supplierIds" item="item" index="index" open="(" separator="," close=")"> #{item} <-- *此處為錯誤原因* --> </foreach> AND tsri.reg_id = #{regId} AND tsci.status = 0 </update>
其他的代碼不做修改;
5.結果
修改后,可正常更新記錄,不再報錯;