mybatis使用resultMap解决嵌套属性问题

389 阅读1分钟

问题描述

🍡在使用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,因此需要自定义返回结果集

image.png

解决方案

🍡使用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>

🍡代码图解 image.png

🍡最终测试结果

image.png