mysql:表和实体字段类型映射sql使用ifnull判空后导致类型转换出错

使用 ifnull判空后导致返回类型变成了long类型:

实体属性类型为Integer包装类型,表字段类型为int类型,
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
sql这样写
在这里插入图片描述
在这里插入图片描述
使用ifnull函数判空后的返回值被转成了long类型,导致转换出错,因为IFNULL()返回一个数字或字符串值。

导致反射调用set方法时,报以下错误:
java.lang.IllegalArgumentException: Cannot invoke com.csg.comp.entity.vt.gk.VT_GK_CYYY.setYyjb on bean class ‘class com.csg.comp.entity.vt.gk.VT_GK_CYYY’ - argument type mismatch - had objects of type “java.lang.Long” but expected signature “java.lang.Integer”

解决办法

因为要转成java的包装类型
所以在sql里做转换,使用cast(字段 as SIGNED INTEGER) ,如果要转成基本数据类型 int 使用cast(字段 as signed)句型,signed等价于int。但不能写成cast(字段as int ),singed并不是mysql中的基本类型,比如使用其创建表时会出错,
或者 字段+0强制转换成int类型

我用了以上的方法,还是会自动转换成long 类型,还是报错,原因还是用ifnull判断导致的。
所以改成了一下方式不用ifnull来判断,就可以了

使用cast when 来判断,返回是否为null,这是是对两个字段进行判断,取其中一个值,都为空则返回 null
CASE WHEN ( p.yyjb IS NOT NULL ) AND ( c.yyjb IS NOT NULL )
THEN
null
WHEN p.yyjb IS NULL
THEN c.yyjb
ELSE p.yyjb
END AS YYJB

总结:在数据库表字段类型为int或者整型时,sql不要用ifnull来判断,否则可能导致j实体类转换出错

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值