Mybatis使用ResultMap中嵌套collection标签主键id不封装的问题

mapper.xml文件如下

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.fangxinqian.order.zhendao.service.mapper.ProductMapper">

    <resultMap type="cn.fangxinqian.order.zhendao.common.vos.ProductByGroupVO" id="productByGroupVO">
        <collection column="id" property="simple" ofType="cn.fangxinqian.order.zhendao.common.vos.EnclosureVO"
                    select="getSimple">
        </collection>
        <collection column="id" property="active" ofType="cn.fangxinqian.order.zhendao.common.vos.EnclosureVO"
                    select="getActive">
            <id column="id" property="id"/>
            <result column="name" property="name"/>
            <result column="enclosure_url" property="enclosureUrl"/>
        </collection>
    </resultMap>

    <select id = "getProductByGroup" resultMap="productByGroupVO">
        SELECT distinct p.id,
        p.product_name,
        p.create_time,
        IFNULL(
        (SELECT count(1)
        FROM t_template_product
        GROUP BY  product_id
        HAVING product_id = p.id),0) 'count'
    FROM t_product p
    LEFT JOIN t_template_product tp
        ON p.id = tp.product_id
    WHERE true
    <if test="groupId != 0">
        AND p.group_id = #{groupId}
    </if>
    <if test="key != null">
        AND p.product_name like CONCAT(CONCAT('%',#{key},'%'))
    </if>
    </select>

    <!-- 获取未删除的普通附件 -->
    <select id="getSimple" resultType="cn.fangxinqian.order.zhendao.common.vos.EnclosureVO" parameterType="integer">
        select id,`name`,enclosure_url from t_enclosure e where product_id = #{id} and enclosure_type = 0 and enclosure_status = 0
    </select>

    <!-- 获取未删除的活动附件 -->
    <select id="getActive" resultType="cn.fangxinqian.order.zhendao.common.vos.EnclosureVO" parameterType="integer">
        select id,`name`,enclosure_url from t_enclosure e where product_id = #{id} and enclosure_type = 1 and enclosure_status = 0
    </select>
</mapper>

这是我的xml文件,如果不使用嵌套查询的话,只执行getProductByGroup是能正常返回的,但是加上了嵌套查询以后,返回除了主查询的主键没有封装进去,别的都正常,确定写了get和set方法,后面在某个论坛上面找到一个解答,就是在写resultMap的时候,主键不以id这样的格式来写<id column="id" property="id"/>,而是以标签来写,在resultMap加上<result column="id" property="id"/> 这样就能成功返回啦。

    <resultMap type="cn.fangxinqian.order.zhendao.common.vos.ProductByGroupVO" id="productByGroupVO">
        <result column="id" property="id"/>
        <collection column="id" property="simple" ofType="cn.fangxinqian.order.zhendao.common.vos.EnclosureVO"
                    select="getSimple">
        </collection>
        <collection column="id" property="active" ofType="cn.fangxinqian.order.zhendao.common.vos.EnclosureVO"
                    select="getActive">
            <id column="id" property="id"/>
            <result column="name" property="name"/>
            <result column="enclosure_url" property="enclosureUrl"/>
        </collection>
    </resultMap>
### 回答1: collection标签用于映射一个集合属性,可以将一个集合类型的属性映射到数据库中的一张表或者另一个实体类中的集合属性。在collection标签中可以使用select、insert、update、delete等标签来定义对集合属性的CRUD操作。同时,collection标签也支持嵌套使用,可以实现对多层嵌套集合属性的映射。 ### 回答2: 在MyBatis的mapper.xml文件中,collection标签用于处理一对多关系的映射。它可以在映射文件中定义一个集合或数组属性,将其与数据库表中的多个记录进行关联。 通过collection标签,可以指定一个列与集合属性之间的映射关系,并且可以对集合进行一些特定的操作,例如增加、删除、修改等。 collection标签有两个主要的属性:property和ofType。property属性指定了集合类型的属性名,即在Java对象中的集合属性名。ofType属性指定了集合中元素的类型,可以是简单类型也可以是复杂类型。 在collection标签的内部,可以使用id标签定义一个作为主键的列名,id标签的property属性指定了Java对象中作为主键的属性名。使用id标签,可以为集合中的每个元素指定一个唯一标识。 collection标签还可以包含其他标签,例如resultMap、association、result等,用于进一步定义关联关系和映射规则。通过这些标签的组合使用,可以实现更复杂的一对多关联映射。 总之,collection标签MyBatis中用于处理一对多关系的重要标签之一。它可以将数据库表中多个记录映射到Java对象的集合属性中,并提供了丰富的操作和映射配置选项,方便开发人员进行一对多关系的数据库操作。 ### 回答3: 在MyBatis的mapper.xml文件中,collection标签用于处理集合类型的映射。它通常用于一对多或多对多的关联关系。collection标签可以嵌套resultMap标签中,用于定义集合类型属性的映射规则。 collection标签有以下常用的属性: - property:指定集合属性的名称。它对应Java对象中的一个集合类型属性,例如List或Set。 - ofType:指定集合元素的类型。可以是Java类的全限定名或别名。 - column:指定关联的数据库字段名。通常用于多表关联查询中,指定关联列的名称。 - select:指定一个关联查询语句的id。这个查询语句将在集合加载时执行,用于加载关联数据。 - fetchType:指定数据加载方式。包括lazy和eager两种,分别表示延迟加载和立即加载,默认为延迟加载。 collection标签使用示例: ``` <resultMap id="userResultMap" type="User"> <id property="id" column="user_id" /> <result property="username" column="user_name" /> <result property="age" column="user_age" /> <collection property="orders" ofType="Order" select="findOrderByUserId" column="user_id" fetchType="eager"> <id property="id" column="order_id" /> <result property="name" column="order_name" /> <result property="price" column="order_price" /> </collection> </resultMap> <select id="findOrderByUserId" resultType="Order"> SELECT * FROM orders WHERE user_id = #{userId} </select> ``` 在上述示例中,resultMap定义了User类的映射规则,并使用collection标签定义了orders属性的映射规则。通过select属性指定了查询关联订单的SQL语句的id,并通过column属性指定了关联的列名。在关联查询时,会加载对应的订单数据,并将其封装为List<Order>类型的属性orders。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值