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

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

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

在这里插入图片描述
在这里插入图片描述
sql这样写
mysql:表和实体字段类型映射sql使用ifnull判空后导致类型转换出错_第1张图片
mysql:表和实体字段类型映射sql使用ifnull判空后导致类型转换出错_第2张图片
使用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实体类转换出错

你可能感兴趣的:(mysql基础)