- 问题描述:查询postedFlag为'Y'/'N'的值,DTO中定义的postedFlag类型为String,执行SQL时报错:
原始代码:
- <if test="postedFlag != null and postedFlag != ''">
-
- <if test="postedFlag.toUpperCase() == 'Y'">
- and cit.POSTED_FLAG = #{postedFlag}
- </if>
-
- <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 != ''">
-
- <if test="postedFlag.toUpperCase() == 'Y'.toString()">
- and cit.POSTED_FLAG = #{postedFlag, jdbcType=VARCHAR}
- </if>
-
- <if test="postedFlag.toUpperCase() == 'N'.toString()">
- and (cit.POSTED_FLAG = #{postedFlag} or cit.POSTED_FLAG IS NULL)
- </if>
- </if>
复制代码 为什么不将'Y'修改为"Y"进行比较,而要使用'Y.toString()'的形式来解决?
XML文件会报错:XML 双引号冲突(语法级报错)
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |