问题描述
🍡在使用mybatis查询时需要返回一个List<SpuItemAttrGroupVo> groupAttrs集合,而SpuItemAttrGroupVo嵌套了泛型为Attr的List集合,代码如下
@Data
public class SpuItemAttrGroupVo {
private String groupName;
private List<Attr> attrs;
}
@Data
public class Attr {
private Long attrId;
private String attrName;
private String attrValue;
}
🍡错误SQL语句如下,resultType是List<SpuItemAttrGroupVo>集合中每个元素的类型,为了保证列名和实体类的属性名对应,给每个查询字段都起了别名
<select id="getSpuItemAttrGroupVo" resultType="com.tomla.gomall.product.vo.SpuItemAttrGroupVo">
SELECT ag.attr_group_name as groupName,
av.attr_id as attrId,
av.attr_name as attrName,
av.attr_value as attrValue
FROM `pms_product_attr_value` av
left join pms_attr_attrgroup_relation ar
on av.attr_id=ar.attr_id
left join pms_attr_group ag
on ag.attr_group_id=ar.attr_group_id
where av.spu_id=#{spuId}
</select>
🍡结果是groupName可以正常获取,但是嵌套的private List<Attr> attrs为 null,因此需要自定义返回结果集
解决方案
🍡使用resultMap自定义返回结果集,其中<collection>标签中定义嵌套属性映射规则
<resultMap id="SpuItemAttrGroupVo" type="com.tomla.gomall.product.vo.SpuItemAttrGroupVo">
<result property="groupName" column="attr_group_name"></result>
<collection property="attrs" ofType="com.tomla.gomall.product.vo.Attr">
<result property="attrId" column="attr_id"></result>
<result property="attrName" column="attr_name"></result>
<result property="attrValue" column="attr_value"></result>
</collection>
</resultMap>
🍡同时也要对select标签中的查询语句进行修改,删除 resultType ,使用自定义的resultMap,而且不需要给字段起别名了
<select id="getSpuItemAttrGroupVo" resultMap="SpuItemAttrGroupVo">
<!--查询语句略-->
</select>
🍡代码图解
🍡最终测试结果