MyBatis sqlSession.selectMap返回Map<key,Map>而非Map<key,value>问题咨询
解决MyBatis selectMap返回Map<Key, Map>而非预期Map<Key, Value>的问题
嘿,我刚好踩过这个升级的坑,咱们一步步把它搞定:
问题根源
MyBatis的selectMap和iBatis的queryForMap有个关键行为差异:
- 如果你只传statementId、参数、key列名三个参数,MyBatis会把整条查询记录封装成一个
Map作为value,最终返回Map<Key, Map<String, Object>> - 而你想要的
Map<Key, Value>(比如Map<String, Date>),得明确告诉MyBatis哪一列要作为value。
解决方案
1. 调用selectMap时指定第四个参数(value列名)
修改你的DAO代码,在selectMap里添加第四个参数——也就是你要作为value的列名(比如你的日期列叫coverageDate):
public Map<String, Date> getCoverageDateList(Long personId, Date coverageEffectiveDate) { Map<String, Object> paramMap = new HashMap<>(); paramMap.put("personId", personId); paramMap.put("coverageEffectiveDate", coverageEffectiveDate); // 第四个参数指定value对应的列名,MyBatis会自动把该列值作为Map的value return sqlSession.selectMap("getCoverageDateList", paramMap, "planCode", "coverageDate"); }
2. 确保Mapper XML的SQL只返回需要的两列
对应你的Mapper XML查询语句,要明确查询key列和value列(避免返回多余字段),同时给列起别名和Java里的key名对应:
<select id="getCoverageDateList" parameterType="map" resultType="java.util.Date"> SELECT plan_code AS planCode, coverage_date AS coverageDate FROM your_coverage_table WHERE person_id = #{personId} AND coverage_effective_date = #{coverageEffectiveDate} </select>
小提醒:如果你的key列(比如
planCode)存在重复值,MyBatis会用后面的记录覆盖前面的,这和iBatis的行为一致,所以要确保key列的唯一性哦。
内容的提问来源于stack exchange,提问作者Pranav Malanthra
相关产品推荐
相关产品推荐

