首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 分段統計 SQL 與 MyBatis 大數值映射陷阱:SUM(CASE...) 返回 BigDecimal 導致 Integer 轉型失敗

     編輯:MySQL 綜合教學

分段統計 SQL (單表單查詢多維度計數)

SELECT 
  SUM(CASE WHEN score < 60 THEN 1 ELSE 0 END) AS '<60',
  SUM(CASE WHEN score BETWEEN 60 AND 69 THEN 1 ELSE 0 END) AS '60~69',
  SUM(CASE WHEN score BETWEEN 70 AND 79 THEN 1 ELSE 0 END) AS '70~79',
  SUM(CASE WHEN score BETWEEN 80 AND 89 THEN 1 ELSE 0 END) AS '80~89',
  SUM(CASE WHEN score >= 90 THEN 1 ELSE 0 END) AS '>=90'
FROM student_course;

結果:

+------+-------+-------+-------+------+
| <60  | 60~69 | 70~79 | 80~89 | >=90 |
+------+-------+-------+-------+------+
| 2    | 1     | 1     | 1     | 10   |
+------+-------+-------+-------+------+

MyBatis 映射陷阱

Mapper XML

錯誤映射

// 接口
Map getScoreStatistics();  // 報錯!

// 錯誤堆棧
java.math.BigDecimal cannot be cast to java.lang.Integer

原因

MySQL SUM() 返回 DECIMAL 類型,JDBC 驅動映射為 java.math.BigDecimal,無法直接強轉 Integer。

正確映射方案 (二選一)

方案 1:返回 Object,手動轉換

Map getScoreStatistics();

// 使用
Map map = mapper.getScoreStatistics();
int count = Integer.parseInt(map.get("<60").toString());

方案 2:返回 BigDecimal,調用 intValue() (推薦)

Map getScoreStatistics();

// 使用
Map map = mapper.getScoreStatistics();
int count = map.get("<60").intValue();  // 直接轉換,性能更好

總結

  1. SQL 分段統計核心:SUM(CASE WHEN ... THEN 1 ELSE 0 END)。
  2. MyBatis 中聚合函數 (SUM/COUNT/AVG) 返回類型通常為 BigDecimal/Long/Double,不要直接映射為 Integer。
  3. 推薦 Mapper 返回 Map,調用 .intValue() 獲取整數。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved