首页 > 其他分享 >【随手记】解决mybatis返回List<map>类型的数据时 无序 并且 不能返回空值

【随手记】解决mybatis返回List<map>类型的数据时 无序 并且 不能返回空值

时间:2023-04-12 14:11:26浏览次数:39  
标签:返回 结果 List 空值 COALESCE mybatis null

返回结果无序

希望表格的列能根据数据库查出来的数据保持一致,但是返回页面的结果集是无序

在mybatis中使用List<Map>结构接收数据,发现输入的sql语句结果并不是按照输入的字段名顺序返回的。

例如输入

select col1,col2,col3 from table

却返回

col2 col3 col1
* * *
* * *

字段顺序和输入的完全不一样

原因

原来我的查询返回resultType = "map", 也就是这个map,打乱了顺序。因为map并不能保证存入取出数据一致。

解决

将原来的map

<select id="test" resultType="map">

改为LinkedHashMap

<select id="test" resultType="java.util.LinkedHashMap">

返回结果没有空值

返回的结果无序解决了 又发现一个新的问题,当我将结果集遍历到表格时,发现有两列数据是乱的。看后台打印才发现当结果中为null值时,是不返回的,key和value都没有。

原因

当使用MyBatis或其他ORM框架查询数据库时,返回的Map是不会包含空值的。这是因为Java的Map数据结构是不允许空值的。

在 MyBatis 中,如果查询的结果集中某些字段值为 null,那么这些字段在返回的 List 中就不会显示。这是因为 MyBatis 使用了一个默认的 ResultSetHandler 实现类 DefaultMapResultHandler 来处理查询结果,这个实现类在遍历结果集时会忽略值为 null 的字段。

解决

如果需要显示空值,可以考虑自定义 ResultSetHandler 实现类,或者在 SQL 中使用 COALESCE 或 IFNULL 等函数来替换为默认值。

示例:假设查询结果集中存在字段值为 null 的情况,我们可以使用如下 SQL:

SELECT COALESCE(DICT_ID, '') AS 编号,
       COALESCE(STATUS, '') AS 状态,
       COALESCE(CREATE_TIME, '') AS 创建时间,
       COALESCE(CREATE_BY, '') AS 创建者,
       COALESCE(DICT_TYPE, '') AS 类型,
       COALESCE(DICT_NAME, '') AS 名称
FROM sys_dict_type

上述 SQL 使用了 COALESCE 函数来将值为 null 的字段替换为空字符串,这样就能保证在返回的 List 中显示所有字段了。


不过我的项目中是使用动态sql查询的,所有这个方法并不能满足需求,而且结果集中连key都没有返回

因为Mybatis默认忽略null值和空字符串

<configuration>
  <settings>
    <setting name="callSettersOnNulls" value="true"/>
  </settings>
</configuration>

callSettersOnNulls是在null值和空字符串时也调用setter方法。

在这个配置文件中添加后,再次运行查询语句,就可以看到空值和相应的key了。

标签:返回,结果,List,空值,COALESCE,mybatis,null
From: https://www.cnblogs.com/Cloong/p/17309615.html

相关文章

  • R语言中的matrix(矩阵),list(列表),data.frame(数据框)总结
    一、R语言中的矩阵matrix是一个二维的数组array,因此数组array的一些操作它也适用。①它与array相比,特有的是矩阵的一些运算,例如:求维度:dim(A)转置:t(A)求行列式:det(A)矩阵相乘:x%*%y对角运算:diag(A)求逆:solve(A,b)求特征值和特征向量:eigen(A)奇异值分解:svd(A)②在多维数组中,apply函数......
  • 【shell】curl 命令出现000返回码
    背景业务过程中,使用put接口调用修改时,curl返回的码是000原因put修改的是相同的数据,业务端返回接口较长页面调用swagger,很长时间后才返回200通过加--connect-timeout100-m300解决(主要是-m参数)----connect-timeout<seconds>设置最大请求时间-m/--max-time......
  • mybatis if-else(写法)
    mybatisif-else(写法)mybaits中没有else要用chosewhenotherwise代替范例<selectid="selectSelective"resultMap="xxx"parameterType="xxx">select<includerefid="Base_Column_List"/>fromxxxwhe......
  • SpringBoot 集成 MybatisPlus 六——ActiveRecord 增、删、改
    1向表中插入记录1.1插入所有列在创建实体对象时,指定所有字段的内容,包括ID列。@TestpublicvoidtestAddUser(){Useruser=newUser(20,"成吉思汗","男","一代天骄");booleanres=user.insert();System.out.println(res);}调用MyBatisPlus时,后台执行的......
  • java学习日记20230410-List
    List接口基本介绍List集合类中元素有序,即添加顺序和取出顺序一致,且可重复;List集合中的每隔元素都有其对应的顺序索引,即支持索引List容器中的元素都对应一个整数型的序号记载其在容器中的位置,可以根据序号存取容器中的元素JDKAPI中List接口的实现类有:ArrayListLinkedListVe......
  • 一文掌握ArrayList和LinkedList源码解读
    大家好,我是Leo!今天来看一下ArrayList和LinkedList的源码,主要是看一下常用的方法,包括像add、get、remove方法,大部分都是从源码直接解读的,相信大家读完都会有一定收获。ArrayListList<String>list=newArrayList<>();list.add("zly");list.add("coding");list.add("菜......
  • LRU management (牛客多校) (map+list)
        思路:利用map+list暴力模拟就彳于了#pragmaGCCoptimize(2)#include<bits/stdc++.h>usingnamespacestd;#defineIOSios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);#defineMAXN100001#defineINF(0x3f3f3f3f)#defineuintunsignedint#d......
  • 批处理返回Oracle的表数据
    bat:@ECHOOFFGOTOchoice:choiceECHO===============ECHO选择要查询的系统ECHO1.准生产集中ECHO2.准生产两融ECHO3.准生产一柜通ECHO4.仿真集中ECHO5.仿真两融ECHO6.仿真一柜通ECHO===============SET/pa=输入数字:IF%a%==1GOTO1IF%a%==2GOTO2IF......
  • c#之winform—listview中排序 和 ICompare接口和IComparer接口的比较
    要在listview中实现排序,需要用listview.Sorting属性,它接受一个枚举类型的值list_view.Sorting=SortOrder.Ascending;//1为正序>其中None=0,//不排序Ascending=1,//升序Descending=2//降序然后在将ListViewItemComparer这个类的实例......
  • c# list-Clone
    C#List引用类型克隆的3种方法这篇文章主要给大家介绍了关于C#List引用类型克隆的3种方法,包括反射、序列化(依赖Newtonsoft.Json)以及序列化(BinaryFormatter)的实现方法,需要的朋友可以参考借鉴,下面来一起看看吧前言有时候我们想克隆一个List去做别的事,而不影响原来的List,我们......