【Java】解決MyBatis接受Select中聚合函數的值,出現:java.math.BigDecimal cannot be cast to java.lang.Integer 問題

異常

[org.springframework.scheduling.support.TaskUtils$LoggingErrorHandler 95 handleError] - Unexpected error occurred in scheduled task. java.lang.ClassCastException: java.math.BigDecimal cannot be cast to java.lang.Integer
	at com.auto.async.AutoDashboard.sendSubReport(AutoDashboard.java:506) ~[classes/:?]
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_171]
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_171]
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_171]
	at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_171]
	at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:333) ~[spring-aop-4.3.13.RELEASE.jar:4.3.13.RELEASE]
	at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190) ~[spring-aop-4.3.13.RELEASE.jar:4.3.13.RELEASE]
	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:741) ~[spring-aop-4.3.13.RELEASE.jar:4.3.13.RELEASE]
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) ~[spring-aop-4.3.13.RELEASE.jar:4.3.13.RELEASE]
	at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:673) ~[spring-aop-4.3.13.RELEASE.jar:4.3.13.RELEASE]
	at com.auto.async.AutoDashboard$$EnhancerBySpringCGLIB$$b3bebd01.sendSubReport(<generated>) ~[classes/:?]
	at com.auto.async.AutoRunSub.runSubDashBoard(AutoRunSub.java:69) ~[classes/:?]
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_171]
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_171]
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_171]
	at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_171]
	at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:65) ~[spring-context-4.3.13.RELEASE.jar:4.3.13.RELEASE]
	at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) [spring-context-4.3.13.RELEASE.jar:4.3.13.RELEASE]
	at org.springframework.scheduling.concurrent.ReschedulingRunnable.run(ReschedulingRunnable.java:81) [spring-context-4.3.13.RELEASE.jar:4.3.13.RELEASE]
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [?:1.8.0_171]
	at java.util.concurrent.FutureTask.run(FutureTask.java:266) [?:1.8.0_171]
	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180) [?:1.8.0_171]
	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293) [?:1.8.0_171]
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [?:1.8.0_171]
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [?:1.8.0_171]
	at java.lang.Thread.run(Thread.java:748) [?:1.8.0_171]

重點異常內容是:
Unexpected error occurred in scheduled task. java.lang.ClassCastException: java.math.BigDecimal cannot be cast to java.lang.Integer

對應代碼:

//定義的SQL接口方法
@Select("SELECT SUM(weekTimes) AS 'times', SUM(weekErrTimes) AS 'errTimes', SUM(weekDelay) AS 'delay', SUM(recordLen) AS 'recordLen' FROM dashboard WHERE proId=#{proId}")
Map<String, Integer> getProAllErrSub(@Param(value = "proId") int proId);

//應用對應的接口方法
A: Map<String, Integer> subs = managerDashboard.getProAllErrSub(pro.getId());
B: int recordLen = Integer.parseInt(subs.get("recordLen").toString());   // 就是這裏報錯

分析

因爲A代碼在執行過程中沒有報錯,但是在B執行的是否沒有報錯(前提是有數據的),這時候從異常上看,還是數據類型有問題,BigDecimal不能轉Integer,並不能說明B處的代碼有問題,通過了解才知道,MyBatis查詢出來的數據默認都是BigDecimal,所以在接收SELECT數據的是否就不能用Integer類型,而是用BigDecimal,所以修改SQL接口方法返回類型。(BigDecimal不能直接轉換爲Integer類型)

正確代碼

//定義的SQL接口方法
@Select("SELECT SUM(weekTimes) AS 'times', SUM(weekErrTimes) AS 'errTimes', SUM(weekDelay) AS 'delay', SUM(recordLen) AS 'recordLen' FROM dashboard WHERE proId=#{proId}")
Map<String, BigDecimal> getProAllErrSub(@Param(value = "proId") int proId);

//應用對應的接口方法
A: Map<String, BigDecimal> subs = managerDashboard.getProAllErrSub(pro.getId());
B: int recordLen = Integer.parseInt(subs.get("recordLen").toString());   
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章