<resultMap id="eqMapVo" type="EquipmentVo"> <result property="eqId" column="eq_id"/> <result property="companyId" column="company_id"/> <result property="itemName" column="item_name"/> <result property="eqName" column="eq_name"/> <result property="serialNumber" column="serial_number"/> <collection property="maps" javaType="Map"/> </resultMap>中,maps的字段如何指定
时间: 2023-07-03 12:30:23 浏览: 47
在 `<collection>` 标签中,通过 `property` 属性指定集合属性的名称,这里是 `maps`。而 `javaType` 属性指定集合中元素的类型,这里是 `Map`,表示该集合中的元素是 `Map` 类型。如果查询结果中包含了与 `maps` 集合相关的列,可以在 `<collection>` 标签中通过 `<result>` 标签来映射这些列到 `Map` 对象的属性上。例如,如果查询结果中包含了 `key` 和 `value` 两列,可以通过如下方式将它们映射到 `Map` 对象的属性上:
```
<collection property="maps" javaType="Map">
<result column="key" property="key"/>
<result column="value" property="value"/>
</collection>
```
这样,在映射查询结果时,每行记录中的 `key` 和 `value` 列的值都会被封装成一个 `Map` 对象,并添加到 `maps` 集合中。
相关问题
使用<resultMap id="eqMapVo" type="EquipmentVo"> <result property="eqId" column="eq_id"/> <result property="companyId" column="company_id"/> <result property="itemName" column="item_name"/> <result property="eqName" column="eq_name"/> <result property="serialNumber" column="serial_number"/> <collection property="maps" javaType="Map"> <result column="mm" javaType="string" property="mm"/> <result column="yy" javaType="string" property="yy"/> <result column="week" javaType="string" property="week"/> <result column="dd" javaType="string" property="dd"/> <result column="hh" javaType="string" property="hh"/> <result column="minit" javaType="string" property="minit"/> <result column="eqName" javaType="string" property="eqName"/> <result column="itemName" javaType="string" property="itemName"/> <result column="rm" javaType="bigDecimal" property="rm"/> </collection> </resultMap>映射public class EquipmentVo extends RegionalEquipment { private List<EquipmentDataVo> equipmentDataVoList; private List<Map> maps; public List<Map> getMaps() { return maps; } public void setMaps(List<Map> maps) { this.maps = maps; } public List<EquipmentDataVo> getEquipmentDataVoList() { return equipmentDataVoList; } public void setEquipmentDataVoList(List<EquipmentDataVo> equipmentDataVoList) { this.equipmentDataVoList = equipmentDataVoList; } },抛出org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.reflection.ReflectionException: Could not set property 'maps' of 'class com.hapstar.regional.domain.vo.EquipmentVo' with value '{hh=2023-05-05 16, eqName=RM/7199, itemName=测试项目, rm=1.46}' Cause: java.lang.IllegalArgumentException: argument type mismatch异常,如何处理
这个异常是因为 MyBatis 在设置 'maps' 属性时,无法将一个 Map 对象转换为 List<Map> 类型,解决方法是修改 'maps' 属性的类型为 Map,或者修改 resultMap 中的 collection 的 javaType 为 List<Map<String, Object>>。例如:
<resultMap id="eqMapVo" type="EquipmentVo">
<result property="eqId" column="eq_id"/>
<result property="companyId" column="company_id"/>
<result property="itemName" column="item_name"/>
<result property="eqName" column="eq_name"/>
<result property="serialNumber" column="serial_number"/>
<collection property="maps" javaType="java.util.Map">
<result column="mm" javaType="string" property="mm"/>
<result column="yy" javaType="string" property="yy"/>
<result column="week" javaType="string" property="week"/>
<result column="dd" javaType="string" property="dd"/>
<result column="hh" javaType="string" property="hh"/>
<result column="minit" javaType="string" property="minit"/>
<result column="eqName" javaType="string" property="eqName"/>
<result column="itemName" javaType="string" property="itemName"/>
<result column="rm" javaType="bigDecimal" property="rm"/>
</collection>
</resultMap>
同时,修改 EquipmentVo 中的 'maps' 属性的类型为 List<Map<String, Object>>,并且提供 getter 和 setter 方法。
public class EquipmentVo extends RegionalEquipment { private List<EquipmentDataVo> equipmentDataVoList; private List<Map> maps; public List<Map> getMaps() { return maps; } public void setMaps(List<Map> maps) { this.maps = maps; } public List<EquipmentDataVo> getEquipmentDataVoList() { return equipmentDataVoList; } public void setEquipmentDataVoList(List<EquipmentDataVo> equipmentDataVoList) { this.equipmentDataVoList = equipmentDataVoList; } } <resultMap id="eqMapVo" type="EquipmentVo"> <result property="eqId" column="eq_id"/> <result property="companyId" column="company_id"/> <result property="itemName" column="item_name"/> <result property="eqName" column="eq_name"/> <result property="serialNumber" column="serial_number"/> <collection property="maps" javaType="Map"> <result column="mm" property="mm"/> <result column="yy" property="yy"/> <result column="week" property="week"/> <result column="dd" property="dd"/> <result column="hh" property="hh"/> <result column="minit" property="minit"/> <result column="eqName" property="eqName"/> <result column="itemName" property="itemName"/> <result column="rm" property="rm"/> </collection> </resultMap>是否可行
这段代码可以用来定义 MyBatis 的结果映射,将查询结果映射成 `EquipmentVo` 对象。
在这段代码中,`<resultMap>` 标签定义了一个名为 `eqMapVo` 的结果映射,将查询结果映射成 `EquipmentVo` 对象。在 `<result>` 标签中,使用 `property` 属性指定了 Java 对象的属性名,使用 `column` 属性指定了查询结果的列名。这里使用了 `<collection>` 标签来映射 `maps` 属性,将查询结果的多条记录映射成一个 `List<Map>` 对象。
需要注意的是,在 `<collection>` 标签中的 `javaType` 属性应该为 `java.util.List`,而不是 `java.util.Map`,因为结果集中的每一行数据都是一个 `Map` 对象,这些 `Map` 对象组成了一个 `List` 对象。此外,在 `<result>` 标签中使用的 `property` 属性应该与 `Map` 对象的键值对中的键名相同,以便将查询结果正确地映射到 `Map` 对象中。