MyBatis Pivot XML含'['触发NumberFormatException异常求助
解决MyBatis中PIVOT含方括号字符串报错的问题
问题原因
MyBatis的SQL解析器会对SQL里的特殊字符做额外解析,当PIVOT的IN子句中出现[时,它会误把方括号内的内容当成数字解析,从而抛出NumberFormatException。而Oracle数据库工具是直接把SQL发送给数据库执行,不会做这层额外解析,所以能正常运行。
解决办法
方法1:用CDATA包裹PIVOT相关SQL
把包含方括号的PIVOT部分用<![CDATA[ ]]>包裹,让MyBatis跳过对这部分内容的解析,直接原样发送给数据库。
示例MyBatis XML映射代码:
<select id="queryPivotData" resultType="java.util.Map"> <![CDATA[ SELECT * FROM ( SELECT job, deptno, sal FROM emp ) PIVOT ( SUM(sal) FOR deptno IN ('[test] It is Test1','[test] It is Test2','[test] It is Test3') ) ORDER BY job ]]> </select>
方法2:动态生成IN子句时用正确参数绑定
如果IN里的内容是动态生成的,用MyBatis的<foreach>标签配合#{}参数绑定,避免直接拼接字符串触发解析错误。
示例动态SQL写法(假设传入参数为List<String> deptNames):
<select id="queryDynamicPivotData" parameterType="java.util.Map" resultType="java.util.Map"> SELECT * FROM ( SELECT job, deptno, sal FROM emp ) PIVOT ( SUM(sal) FOR deptno IN ( <foreach collection="deptNames" item="name" separator=","> '#{name}' </foreach> ) ) ORDER BY job </select>
这里用#{name}而非${name},因为#{}会自动处理字符串转义和类型识别,避免MyBatis误解析方括号内容。如果必须用${}拼接,记得把整个PIVOT部分放在CDATA里。
不推荐的方法:修改MyBatis配置关闭解析特性
虽然可以通过修改MyBatis配置关闭相关解析,但这种方法可能影响其他SQL的正常解析,风险较高,不建议使用。
内容的提问来源于stack exchange,提问作者임영광
相关产品推荐
相关产品推荐

