返回结果无序
希望表格的列能根据数据库查出来的数据保持一致,但是返回页面的结果集是无序
在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
解决
如果需要显示空值,可以考虑自定义 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