spring中case一直返回else中的值-问题和原理详解
目录
案例背景
问题现象
问题根源
解决过程
最终结论
经验总结
案例背景
在基于 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
等)是否兼容。