mybatis collection嵌套查询语句时,多条数据只查询出一条可能存在的问题

MyBatis嵌套查询多条数据
博客围绕MyBatis展开,涉及嵌套查询多条数据相关内容,虽未给出详细代码,但从标签可知重点在于MyBatis的嵌套查询功能,用于处理多条数据的查询场景。

代码如下:

<resultMap id="result_SwcRpsstmr_Map" type="cc.geoworks.wscs.web.entity.SwcRpsstmr">
    <id column="SPID" property="spid" />
    <result column="RFCD" property="rfcd" />
    <result column="OBTM" property="obtm" />
</resultMap>

<resultMap id="SwcRpsstmrMap" type="cc.geoworks.wscs.web.entity.SwcRpsstmr" extends="result_SwcRpsstmr_Map">
    <collection property="rpssList" javaType="ArrayList" ofType="cc.geoworks.wscs.web.entity.SwcRpss" columnPrefix="RPSS_" resultMap="rpssMap"/>
</resultMap>

<resultMap id="rpssMap" type="cc.geoworks.wscs.web.entity.SwcRpss">
    <id property="rpcd" column="RPCD"/> //必须为唯一值
    <result property="rpnm" column="RPNM"/>
    <result property="spid" column="SPID"/>
    <collection property="tanks" javaType="ArrayList" ofType="cc.geoworks.wscs.web.entity.SwcRpsswdr" columnPrefix="TK_" resultMap="SwcRpsswdrBbsMap"/>
</resultMap>

<resultMap id="SwcRpsswdrBbsMap" type="cc.geoworks.wscs.web.entity.SwcRpsswdr">
    <id column="SPWID" property="spwid" />    //此处为问题所在,必须为唯一值
    <result column="SPID" property="spid" />
    <result column="NT" property="nt" />
    <result column="MODITIME" property="moditime" />
</resultMap>

<sql id="rpss_column_list">
    d.RPCD  AS RPSS_RPCD,//此处 前缀与SwcRpsstmrMap里columnprefix一致  
    b.RPNM  AS RPSS_RPNM,
    m.SPID  AS RPSS_SPID
</sql>
<sql id="rpsswdr_column_list">
    t.SPWID AS RPSS_TK_SPWID,  //此处的前缀与SwcRpsstmrMap、rpssMap 里的columnprefix一致
    m.SPID  AS RPSS_TK_SPID,
    d.nt  AS RPSS_TK_NT,
</sql>
<select id="findList" parameterType="cc.geoworks.wscs.web.common.Assist" resultMap="SwcRpsstmrMap">
    SELECT
    <include refid="rpss_column_list" />
    <include refid="rpsswdr_column_list" />
    FROM
    swc_rpsstm_r m
    INNER JOIN table1 d ON m.SPID = d.SPID
    INNER JOIN table2 t ON t.SPWID = d.SPWID
    INNER JOIN table3 b ON b.RPCD = d.RPCD
### 3.1 `<collection>` 嵌套查询的关联依据 MyBatis 中 `<collection>` 标签用于处理 Java 对象中集合属性的映射,尤其在实现一对多关系(One-to-Many),其嵌套查询的关联机制依赖于字段匹配和 SQL 查询设计。 在嵌套查询中,`<collection>` 通过 `column` 属性指定用于关联的字段,并将该字段的值作为参数传递给嵌套的 SQL 查询(由 `select` 属性指定)。例如,在查询订单信息,可以使用 `<collection>` 标签嵌套一个查询订单项的 SQL 语句,其中 `column="order_id"` 表示将主查询结果中的 `order_id` 字段值传递给嵌套查询,用于查找对应的订单项数据。这种方式实现了基于字段值的动态关联查询 [^1]。 ### 3.2 关联机制的实现方式 `<collection>` 的关联机制可以分为两种主要方式: - **嵌套 Select 查询**:通过 `select` 属性指定另一个 SQL 查询,并通过 `column` 属性传递参数。这种方式适用于通过多个独立 SQL 语句加载关联数据的情况。例如,主查询获取订单信息,而 `<collection>` 使用另一个 SQL 查询获取订单项数据。这种方式可以减少主查询的复杂性,并在需要延迟加载关联数据 [^1]。 - **嵌套结果映射**:适用于使用单条 SQL 语句通过 JOIN 操作获取主数据和关联数据的情况。在这种情况下,SQL 查询将主表和关联表连接在一起,结果集包含重复的主数据字段。MyBatis 会根据这些字段将关联数据正确映射到集合属性中。这种方式通过字段匹配和数据折叠机制,将关联数据组装到对应的对象集合中 [^1]。 ### 3.3 示例代码 以下是一个使用 `<collection>` 进行嵌套 Select 查询的示例: ```xml <resultMap id="orderResultMap" type="Order"> <id property="orderId" column="order_id"/> <result property="orderNumber" column="order_number"/> <collection property="orderItems" column="order_id" select="findOrderItemsByOrderId"/> </resultMap> <select id="getOrderById" resultMap="orderResultMap"> SELECT * FROM orders WHERE order_id = #{orderId} </select> <select id="findOrderItemsByOrderId" resultType="OrderItem"> SELECT * FROM order_items WHERE order_id = #{orderId} </select> ``` 在上述代码中,`<collection>` 标签通过 `select` 属性指定 `findOrderItemsByOrderId` 查询,并通过 `column` 属性传递 `order_id` 参数。MyBatis 会根据主查询中的 `order_id` 执行嵌套查询以获取订单项数据,并将其映射到 `Order` 对象的 `orderItems` 集合属性中 。 ### 3.4 嵌套结果映射的注意事项 当使用嵌套结果映射,由于 SQL 查询中使用 JOIN 操作,结果可能包含重复的主数据字段。为了正确映射数据MyBatis 会根据主数据字段的值折叠重复数据,仅保留一份主数据记录。这种方式可能导致主数据记录数少于实际查询结果的行数,从而影响分页查询的准确性。为了解决这个问题,需要确保主数据字段的值在结果集中保持一致,或者在分页查询中采用其他策略。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值