You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,提问作者임영광

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 22:12:45