报错信息:
java.lang.NumberFormatException: For input string: "Critical" at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:67) ~[na:na]
resultMap如下:
<resultMap id="severityNumResultMap" type="com.chinamobile.icmp.rest.model.agent.resp.event.EventNumResp"><result column="severity" property="severity" jdbcType="VARCHAR"/><result column="quantity" property="quantity" jdbcType="BIGINT"/> </resultMap>
当使用下面sql时就会报上面的错误
<select id="querySeverityNum" resultMap="severityNumResultMap">
select severity, count(*) as quantity from (select severity from event_monitor where collect_time >= #{startTime}) group by severity
</select>
使用下面的SQL就可以正常返回
<select id="querySeverityNum" resultMap="severityNumResultMap">
select count(*) as quantity, severity from (select severity from event_monitor where collect_time >= #{startTime}) group by severity
</select>
这条查询语句与第一条仅在列顺序上有所不同,先输出count(*) as quantity,再输出severity。同样,若severityNumResultMap映射关系设置正确,这条查询本身也不会直接导致NumberFormatException。
问题定位与解决方案:
考虑到您提到的错误信息,问题更可能出现在处理查询结果的业务逻辑中,而非查询语句本身。具体来说,可能存在如下情况:
业务逻辑代码: 您的业务代码可能在遍历查询结果时,误将severity列(字符串类型)当作数字进行处理。请检查处理查询结果的代码段,确保正确处理severity列作为字符串。
resultMap配置: 如果severityNumResultMap映射关系中对severity列定义为数字类型,而非字符串类型,也会导致在MyBatis解析结果时尝试进行非法的数值转换。请检查severityNumResultMap的定义,确保severity列映射为字符串类型。
第三方库或框架处理: 如果使用了其他库或框架来处理查询结果,它们可能有默认的类型转换行为。检查这些库或框架的配置和使用方式,确保它们不对severity列进行不必要的数值转换。
为解决此问题,建议您:
检查处理查询结果的业务逻辑代码,确保正确处理severity列作为字符串,避免对其进行数值转换。
验证severityNumResultMap映射关系,确认severity列映射为字符串类型。
排查可能影响结果处理的第三方库或框架,确保它们不对severity列进行错误的数值转换。
修复以上潜在问题后,应该能解决NumberFormatException。如果问题仍然存在,请提供更多上下文信息(如处理查询结果的代码片段、severityNumResultMap的具体定义等),以便进一步诊断。