mybatisplus 使用group by 和 count 报 java.lang.NumberFormatException

文章讲述了在处理Java应用中的MyBatis查询时遇到NumberFormatException,原因可能是对字符串类型的`severity`列误作数值处理或resultMap配置错误。解决策略包括检查业务逻辑、resultMap映射和可能影响的第三方库。
摘要由CSDN通过智能技术生成

报错信息:

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.xxx.xxx.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的具体定义等),以便进一步诊断。

public class EventNumResp implements Serializable {
    private BigInteger quantity;
    private String severity;

}

后来发现是和EventNumResp里字段顺序有关系,我把quantity放到下面后第条sql调用时开始报错,第一条就可以了

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值