- 问题描述:查询postedFlag为'Y'/'N'的值,DTO中定义的postedFlag类型为String,执行SQL时报错:
原始代码:
<if test="postedFlag != null and postedFlag != ''"> <!-- 传入Y:只查postedFlag=Y --> <if test="postedFlag.toUpperCase() == 'Y'"> and cit.POSTED_FLAG = #{postedFlag} </if> <!-- 传入N:查postedFlag=N 或 空 --> <if test="postedFlag.toUpperCase() == 'N'"> and (cit.POSTED_FLAG = #{postedFlag} or cit.POSTED_FLAG IS NULL) </if> </if>报错信息:
{ "code": "500", "message": "接口 [/v1/inventory-transactions/query]内部错误,请联系管理员,错误信息:\r\n### Error querying database. Cause: java.lang.NumberFormatException: For input string: \"N\"\r\n### Cause: java.lang.NumberFormatException: For input string: \"N\"", "data": null }错误原因:
- 使用
'Y'是由单引号包裹的单字符,直接被转换为Char类型,使用'ABC'是由单引号包裹的多字符,会按照String类型处理'Y'为Char类型,而左边传入的postedFlag是String类型,所以会有类型转换的异常- 虽然是
Char转换String的错误,但是OGNL在比较俩个不同类型的值时,不会直接做【类型转换】,而是优先做【数值转换】,即在处理 char 与 String 比较时,走了【先转数字再比较】的中间链路,先将俩边的值都转为数字,再比较数字大小,因此会抛出NumberFormatException的异常修改后正确的代码:
<if test="postedFlag != null and postedFlag != ''"> <!-- 传入Y:只查postedFlag=Y --> <if test="postedFlag.toUpperCase() == 'Y'.toString()"> and cit.POSTED_FLAG = #{postedFlag, jdbcType=VARCHAR} </if> <!-- 传入N:查postedFlag=N 或 空 --> <if test="postedFlag.toUpperCase() == 'N'.toString()"> and (cit.POSTED_FLAG = #{postedFlag} or cit.POSTED_FLAG IS NULL) </if> </if>为什么不将
'Y'修改为"Y"进行比较,而要使用'Y.toString()'的形式来解决?
- 修改为:
<if test="postedFlag.toUpperCase() == "Y" ">XML文件会报错:XML 双引号冲突(语法级报错)
浙公网安备 33010602011771号