前幾天上線抬吟,遇到一個(gè)郁悶的問題,在測試環(huán)境沒任何問題的统抬,但是到正式環(huán)境卻報(bào)java.math.BigDecimal cannot be cast to java.lang.String
異常火本,當(dāng)時(shí)就蒙逼了,難不成正式環(huán)境跟測試環(huán)境數(shù)據(jù)庫類型還不一樣蓄喇?
經(jīng)過定位發(fā)現(xiàn)罪魁禍?zhǔn)资且痪鋝ql里的sum
函數(shù)发侵,在測試環(huán)境返回的是double
可以直接toString
交掏,但正式環(huán)境卻變成bigDeciaml妆偏,尼瑪這么奇葩的問題都被我遇到了,當(dāng)時(shí)心中一萬只草泥馬奔騰而過盅弛。钱骂。。
不過挪鹏,問題終歸還是要解決的见秽,只好上網(wǎng)找原因:
The SUM() and AVG() functions return a DECIMAL value for exact-value arguments (integer or DECIMAL), and a DOUBLE value for approximate-value arguments (FLOAT or DOUBLE). (Before MySQL 5.0.3, SUM() and AVG() return DOUBLE for all numeric arguments.)
http://stackoverflow.com/questions/10592481/what-is-the-return-type-of-sum-in-mysql
sum函數(shù)在數(shù)據(jù)庫是number類型的,你的代碼中可以使用任何裝的下數(shù)字型都可以接收讨盒。如:sum的值小于java中int的最大值解取,你就可以用int接收;如果大于Int的最大值而小于double的最大值返顺,你就可以用double禀苦。一般在程序設(shè)計(jì)時(shí),如果不確定它的值范圍遂鹊,可以用long型接收振乏。
哈哈,搜第四列秉扑,原來一直是我理解錯(cuò)了慧邮。sum()
函數(shù)返回的就是deciaml類型,測試環(huán)境數(shù)據(jù)都是生成的,復(fù)雜的不高误澳,double類型就可以接收了耻矮,而正式環(huán)境數(shù)據(jù)超過double的精度范圍,悲劇就這樣發(fā)生了脓匿。
原因搞懂了淘钟,直接將 toString
改為String.valueOf(xx)
搞定,看來以后還是要養(yǎng)成習(xí)慣少用toString
呀陪毡,坑太多米母。