目錄
案例背景
問題現象
問題根源
解決過程
最終結論
經驗總結
案例背景
在基于 Spring Boot + MyBatis 的項目中,需要通過 SQL 的?CASE WHEN
?語句生成 user_Name字段(表示是否有關聯用戶名稱,1
?為有關聯,0
?為無關聯),并映射到實體類?UserNameVo
?的 user_Name字段。但前端始終顯示該字段為?null
,盡管 SQL 中?CASE WHEN 1=1 THEN 1 ELSE 0 END
?理論上應返回?1
。但是也顯示是0,或者是null。
問題現象
- SQL 中明確通過?
CASE WHEN
?生成?user_Name字段,且直接執行 SQL 時結果為?1
。 - 實體類?user_Name
Vo
?中?user_Name字段類型從?long
?改為?Integer
?后,前端仍顯示為?null
。 - 關聯字段?
nameid
?能正常返回值,說明 SQL 關聯邏輯無問題。
問題根源
MyBatis 配置了?map-underscore-to-camel-case: true
(下劃線轉駝峰命名),導致:
- SQL 別名?user_Name(含下劃線)被自動轉為駝峰?userName。
- 實體類字段為?user_Name(含下劃線),與轉換后的駝峰名?userName不匹配,從而映射失敗,字段值為?
null
。
解決過程
- 排查方向:從 SQL 邏輯、實體類類型、MyBatis 結果映射等方面逐一排查,最終聚焦到字段命名匹配問題。
- 解決方案:
- 方案一(關閉下劃線轉駝峰):在?
application.yml
?中設置?mybatis.configuration.map-underscore-to-camel-case: false
,讓 MyBatis 嚴格按字段名(含下劃線)完全匹配映射。 - 方案二(統一駝峰命名):將實體類字段改為?userName,同時 SQL 別名改為?userName,保持下劃線轉駝峰配置開啟,符合項目駝峰命名規范。
- 方案一(關閉下劃線轉駝峰):在?
最終結論
MyBatis 的 “下劃線轉駝峰” 配置導致 SQL 別名與實體類字段名匹配失敗,調整配置或統一字段命名規范后,userName字段能正確接收?1
,問題解決。
經驗總結
在 MyBatis 項目中,若遇到字段映射為?null
?但 SQL 邏輯正確的情況,需優先檢查:
- 字段名匹配:SQL 別名與實體類字段名(含大小寫、下劃線 / 駝峰)是否完全一致。
- MyBatis 配置:
map-underscore-to-camel-case
?等影響字段映射規則的配置是否與字段命名規范沖突。 - 類型兼容性:實體類字段類型與 SQL 返回值類型(如?
int
?與?Integer
、long
?等)是否兼容。