防止Mybatis将list中的字符串类型的数字强制转换成Int类型的方法,数据库报错ORA-01790
一、背景
在代码中有一段形如下面的SQL,数据库是Oracle的
INSERT INTO IPAM.T_SEARCHDETAIL (ID, UNIQUEPART, LOCATIONID, PARANAME, RESULTSTRING, RESULTVALUE, RESULTDATE, SEARCHNO, TYPENO, TYPEVAR, RESULTSTATE) SELECT seq_searchdetail.NEXTVAL, CD.* FROM (SELECT '@F01R20D338@00101432@0204@20200923@125348@@', '00000000531500900001100010001', 'POS2LeftDistance', null, 2.352403, '2020-10-16 00:00:03.454', 1145, null TYPENO, null TYPEVAR, null RESULTSTATE FROM DUAL UNION all SELECT '@F01R20D338@00101432@0204@20200923@125348@@', '00000000531500900001100010001', 'GlueTimeOut', '0', null, '2020-10-16 00:00:03.454', 1145, null TYPENO, null TYPEVAR, null RESULTSTATE --.........还有大约1000多个union在一起的Selct语句
FROM DUAL) CD;
这条语句一般情况下都是正常执行的。因为之前每次执行的时候都满足RESULTSTRING这个字段的数值都是非数字字符串,最近这条SQL一直报ORA-01790
数据量比较大,调试起来比较困难,每次执行都需要3分钟左右。搞来搞去搞了一个晚上还是无法解决。最后缩小数据比例,加快调试进度。Mybatis用log4j打印在控制台的SQL语句又是参数和值分开的,又给IDEA安装了mybatis log plugin插件,调试才顺利了一些。最后猜测有可能是字符串类型的数字在select * from dual的时候被转成了数字。
二、措施
Mybatis XML配置文件
<insert id="insertSearchdetailBatch" parameterType="java.util.List" useGeneratedKeys="false"> INSERT INTO IPAM.T_SEARCHDETAIL(ID,UNIQUEPART,LOCATIONID,PARANAME,RESULTSTRING,RESULTVALUE,RESULTDATE,SEARCHNO,TYPENO,TYPEVAR,RESULTSTATE) SELECT seq_searchdetail.NEXTVAL,CD.* FROM ( <foreach collection="list" index="index" item="item" separator="union all"> SELECT #{item.uniquepart} ,#{item.locationid} ,#{item.paraname} ,#{item.resultstring} ,#{item.resultvalue} ,#{item.resultdate} , #{item.searchno} ,#{item.typeno} TYPENO,#{item.typevar} TYPEVAR,#{item.resultstate} RESULTSTATE FROM DUAL </foreach> )CD </insert>
#{item.resultstring} 改成#{item.resultstring,jdbcType=VARCHAR}
#{item.resultvalue} 改成#{item.resultvalue,jdbcType=FLOAT}
问题得到解决
<insert id="insertSearchdetailBatch" parameterType="java.util.List" useGeneratedKeys="false"> INSERT INTO IPAM.T_SEARCHDETAIL(ID,UNIQUEPART,LOCATIONID,PARANAME,RESULTSTRING,RESULTVALUE,RESULTDATE,SEARCHNO,TYPENO,TYPEVAR,RESULTSTATE) SELECT seq_searchdetail.NEXTVAL,CD.* FROM ( <foreach collection="list" index="index" item="item" separator="union all"> SELECT #{item.uniquepart} ,#{item.locationid} ,#{item.paraname} ,#{item.resultstring,jdbcType=VARCHAR} ,#{item.resultvalue,jdbcType=FLOAT} ,#{item.resultdate} , #{item.searchno} ,#{item.typeno} TYPENO,#{item.typevar} TYPEVAR,#{item.resultstate} RESULTSTATE FROM DUAL </foreach> )CD </insert>
本文来自博客园,作者:迷神图卷,转载请注明原文链接:https://www.cnblogs.com/CryOnMyShoulder/p/13826339.html