3
回答
java.lang.integer cannot be cast to java.lang.string该问题困扰已久
注册华为云得mate10,2.9折抢先购!>>>   

@jfinal 您好

我数据库id为自增逐渐 int类型

我在代码中getStr("id") 或者 getInt("id") 有时候这么用可以 有时候会报错 

有的时候是必须得用getLong("id")才可以

这个是怎么回事呢

举报
就看看
发帖于3年前 3回/22K+阅
共有3个答案 最后回答: 2年前

    当数据库字段为 int 型(有符号int型),但是如果在 sql 中使用了某些函数,jdbc 会自动转型为 long,例如:select sum(money) from account where accountId = 123。这个行为是 jdbc 自动做的,目的是为了防止数据溢出,因为在本例中 money 本来是 int 型,但是 sum(money) 以后很可能数值会超过 java  Integer.MAX_VALUE值。

   另一种 int 自动转 long 型是因为字段使用的是无符号 int 型,这两种自动转型都是 jdbc 自动的,jfinal 未做任何干预。

    至于 int 型可以使用 getStr 读取出来,那必定是值为 null, 否则肯定会抛出类型转换异常。

    解决的办法通常两个:

1:预知可能的转型,使用正确的类型变量去接收值,例如用 Long变量去接收 select sum(xxx)值。

2:使用 getNumber(attr).intValue() 确切一定得到  Integer 值,或者使用 getNumber(attr).longValue() 确切一定得到 Long 值。

我也碰到类型问题:统计时返还的数据类型List<Map<String,String>>,返还的值有{name=中性,value=22},SQL中使用了count()函数,然后用String变量接收value值时,一直包类型转换异常。

换成用Object类型变量接收value值时,就ok了。

楼上分析给了思路,count()返回的值是Long类型的,与Map中的<key,value>类型冲突,在SQL映射数据时,Map并没有去验证,而在取值时,则会验证,此时类型不同,就会报错。

这只是我的个人见解,还望大牛们深入指点。

顶部