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

Mybatis中 list.size() = 1 但显示 All elements are null

一、Bug展示

二、原因分析

2.1.情形一:Mybatis的XML中返回类型映射错误


<select id="selectByDesc" parameterType="com.task.bean.OrderInfo"resultType="com.task.bean.OrderInfo">select MER_ID,SETTLE_DATE,ICE_NAME,ORDER_STATUS,ORDER_CODE,ORDER_DESC,COUNT(*) AS SUM_COUNT,SUM(ORDER_AMT) AS SUM_AMTFROM order_info_${ny}<where><if test="settleDate != null and settleDate != ''">AND SETTLE_DATE = #{settleDate}</if></where>GROUP BY SETTLE_DATE
</select>

 在此时,resultType中对应的是实体bean,但由于参数不完全对应或参数类型不完全匹配,造成查询到的数据不能正常返回。此时可以调整实体bean或修改xml,使字段完全对应;或者使用resultMap重新定义返回参数,示例如下:

<resultMap id="orderInfo" type="com.task.bean.OrderInfo"><result property="orderId" column="ORDER_ID"/><result property="merId" column="MER_ID"/><result property="merName" column="MER_NAME"/>*  *  *  *  *  *  *  *  *  *  *  *  *  *  *<result property="sumCount" column="SUM_COUNT"/>
</resultMap><select id="selectByDesc" parameterType="com.task.bean.OrderInfo"resultMap="orderInfo">    select MER_ID,SETTLE_DATE,ICE_NAME,ORDER_STATUS,ORDER_CODE,ORDER_DESC,COUNT(*) AS SUM_COUNT,SUM(ORDER_AMT) AS SUM_AMTFROM order_info_${ny}<where><if test="settleDate != null and settleDate != ''">AND SETTLE_DATE = #{settleDate}</if></where>GROUP BY SETTLE_DATE
</select>

2.2.情形二:使用了MySQL中的聚合函数

在使用MySQL中的聚合函数,分别是求和函数SUM()、求平均函数AVG()、最大值函数MAX()、最小值函数MIN()和计数函数COUNT, 进而导致出现size = 1,但结果为空的情况。

此时无论是否数据库中是否有值, 返回都不为空。通过上面debug步骤发现, list.size() = 1,但List中值为空, 显示All elements are null

此时在无法优化xml的情况下,可以调整业务层代码,例如:

if (CollectionUtils.isNotEmpty(listData) && listData.get(0) != null) {*  *  *  *  *  *  *  *  *  *  *  *  *  *  *}

手动将这种情况给排除掉。或者,先把list中的null元素给排除掉,然后在进行业务的数据处理

//移除第一个nulllist.remove(null); //或移除所有的null元素list.removeAll(Collections.singleton(null)); 

三、聚合函数 

Java 使用聚合函数查询时,返回的结果一定不为null的原因是聚合函数的定义决定了它们的行为。聚合函数用于对一组值进行计算,并返回一个结果。根据聚合函数的定义,它们总是返回一个非空的结果,即使输入为空或无效。这是为了确保计算的一致性和可靠性。

        举个例子,如果你使用 SUM() 聚合函数计算一组数值的总和,即使输入为空,它也会返回0作为结果。同样地,如果你使用 AVG() 聚合函数计算一组数值的平均值,即使输入为空,它也会返回0作为结果。

        因此,Java 使用聚合函数查询时,可以确保返回的结果一定不为null,而是根据聚合函数的定义返回一个合适的值。同样的,这也造成数据在一定情况下需要手动排查掉NULL的情况。
 

转自:Mybatis中 list.size() = 1 但显示 All elements are null_棒棒糖的糖不含糖的博客-CSDN博客

http://www.lryc.cn/news/147330.html

相关文章:

  • Soul的社交元宇宙之路,还有多远?
  • 如何解决Memcached缓存击穿和雪崩问题
  • uniapp 开发之仿抖音,上下滑动切换视频、点击小爱心效果
  • 【C++设计模式】依赖倒转原则
  • 浙江首例!金华银行基于完全国产自研数据库构建新一代核心系统
  • ASP.NET Core 中的 静态文件
  • 2023年天府杯——C 题:码头停靠问题
  • 集丰照明|汽车美容店设计,装修色彩灯光搭配方法
  • 性能提升3-4倍!贝壳基于Flink + OceanBase的实时维表服务
  • 取数组中每个元素的最高位
  • Docker一键部署Nacos
  • 【数学建模】-- 模糊综合评价
  • Java 数据库改了一个字段, 前端传值后端接收为null问题解决
  • lnmp架构-mysql1
  • Threadlocal在项目中的应用
  • 个性化定制你的AI助手,AI指令提示词专家
  • mongodb聚合排序的一个巨坑
  • 无涯教程-分类算法 - 随机森林
  • c#常见的排序算法
  • Redis 持久化和发布订阅
  • k8s使用ECK(2.4)形式部署elasticsearch+kibana-http协议
  • [maven]关于pom文件中的<relativePath>标签
  • 11. 网络模型保存与读取
  • 新SDK平台下载开源全志V853的SDK
  • 多图详解VSCode搭建Java开发环境
  • 基于JavaWeb和mysql实现网上书城前后端管理系统(源码+数据库+开题报告+论文+答辩技巧+项目功能文档说明+项目运行指导)
  • Swift创建单例
  • 问道管理:市盈率怎么计算?
  • Ansible File模块,Ansible File模块详解,文件管理的自动化利器
  • 记录http与mqtt的区别