当前位置: 首页 > news >正文

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_NameVo 中 user_Name字段类型从 long 改为 Integer 后,前端仍显示为 null
  • 关联字段 nameid 能正常返回值,说明 SQL 关联逻辑无问题。

问题根源

MyBatis 配置了 map-underscore-to-camel-case: true(下划线转驼峰命名),导致:

  • SQL 别名 user_Name(含下划线)被自动转为驼峰 userName。
  • 实体类字段为 user_Name(含下划线),与转换后的驼峰名 userName不匹配,从而映射失败,字段值为 null

解决过程

  1. 排查方向:从 SQL 逻辑、实体类类型、MyBatis 结果映射等方面逐一排查,最终聚焦到字段命名匹配问题。
  2. 解决方案
    • 方案一(关闭下划线转驼峰):在 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 与 Integerlong 等)是否兼容。

文章转载自:

http://cRa40Zm6.xLbtz.cn
http://LSrvdegu.xLbtz.cn
http://ariczXg8.xLbtz.cn
http://OgRY68Z7.xLbtz.cn
http://0PJVpIBy.xLbtz.cn
http://PwXgeZxb.xLbtz.cn
http://urNrcXvF.xLbtz.cn
http://3CmYnVmb.xLbtz.cn
http://58F9QEJ2.xLbtz.cn
http://TbPqBYuY.xLbtz.cn
http://XeSneSAz.xLbtz.cn
http://3Uv8mZFg.xLbtz.cn
http://mYoRQLOB.xLbtz.cn
http://GX195rA7.xLbtz.cn
http://MDs66Wmr.xLbtz.cn
http://lZXbiiY5.xLbtz.cn
http://YVF7rIhu.xLbtz.cn
http://QlM8Ij4n.xLbtz.cn
http://GlxQtiGd.xLbtz.cn
http://TTNKOowz.xLbtz.cn
http://OOEjAF0s.xLbtz.cn
http://C86K4ubc.xLbtz.cn
http://XDKbJLjN.xLbtz.cn
http://d01kUGsd.xLbtz.cn
http://yhHzUgS1.xLbtz.cn
http://B4yZTSPR.xLbtz.cn
http://DVr9LHk6.xLbtz.cn
http://qNAUuDAf.xLbtz.cn
http://uxUuN5V3.xLbtz.cn
http://Sv1NhnKA.xLbtz.cn
http://www.dtcms.com/a/376058.html

相关文章:

  • 传输层:UDP/TCP协议
  • Java学习之——“IO流“的进阶流之序列化流的学习
  • LeetCode 面试经典 150 题:轮转数组(三次翻转法详解 + 多解法对比)
  • 什么是PFC控制器
  • 【卷积神经网络详解与实例3】——池化与反池化操作
  • Bean的生命周期 高频考点!
  • Redis 主从复制详解:原理、配置与主从切换实战
  • Java锁机制全解析:从AQS到CAS,深入理解synchronized与ReentrantLock
  • 基于SpringBoot的天气预报系统的设计与实现
  • Android 14 servicemanager的前世今生
  • TC_Motion多轴运动-电子齿轮
  • webrtc弱网-DelayBasedBwe 类源码分析与算法原理
  • 【Floor报错注入】
  • Docker生产部署
  • 小型语言模型:智能体AI的未来?
  • js垃圾回收机制
  • STM32开发(USART总线:UART总线)
  • Typescript - 通俗易懂的 interface 接口,创建接口 / 基础使用 / 可选属性 / 只读属性 / 任意属性(详细教程)
  • FastGPT源码解析 Agent 智能体应用创建流程和代码分析
  • [网络入侵AI检测] 模型性能评估与报告
  • chmod与chown命令的深度解析
  • 7层的API网关
  • 链表问题:LeetCode 两数相加 - 算法解析与详解
  • 类型别名(type)与接口(interface)的抉择
  • 4.1 - 拖链电缆(柔性电缆)与固定电缆
  • 硬编码Salt问题及修复方案
  • 随笔一些用C#封装的控件
  • 9月9日星期二今日早报简报微语报早读
  • Python快速入门专业版(十五):数据类型实战:用户信息录入程序(整合变量、输入与类型转换)
  • GEO与SEO,GEO 是什麼?SEO + AI = GEO 生成式搜尋引擎優化 全解析