首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

MyBatis resultMap 一對多查詢僅返回最後一條數據的排查指南

     編輯:程式設計綜合問答

問題現象

使用 MyBatis resultMap 進行一對多關聯查詢(如商品與圖片),預期返回多條商品記錄,實際卻只拿到最後一條數據。SQL 在資料庫直接執行卻能正常返回多行。

核心原因:主鍵 id 屬性缺失或重複

resultMap 中的 <id> 標籤用於標識唯一性。若映射的主鍵列(如 tb_item.id)未在 <id> 中聲明,或多條記錄的主鍵值相同,MyBatis 會將其視為同一對象而覆蓋合併,導致結果列表只剩最後一條。

解決步驟

  1. 檢查 SQL 別名:確保主鍵列有明確別名,如 SELECT tb_item.id AS item_id, ...。
  2. 完善 resultMap:在 <resultMap> 中添加 <id property="id" column="item_id"/>。
  3. 驗證集合映射:<collection> 的 ofType 指向正確的子對象類,column 對應外鍵。

正確示例

<resultMap id="itemPicMap" type="Item">
    <id property="id" column="item_id"/>
    <result property="name" column="item_name"/>
    <collection property="pics" ofType="ItemPic">
        <id property="id" column="pic_id"/>
        <result property="url" column="pic_url"/>
    </collection>
</resultMap>

<select id="selectItemAndPic" resultMap="itemPicMap">
    SELECT
        tb_item.id AS item_id,
        tb_item.name AS item_name,
        tb_item_pic.id AS pic_id,
        tb_item_pic.url AS pic_url
    FROM tb_item
    LEFT JOIN tb_item_pic ON tb_item.id = tb_item_pic.item_id
    WHERE tb_item.id IN
    <foreach collection="ids" item="id" open="(" separator="," close=")">
        #{id}
    </foreach>
</select>

快速自查清單

  • SQL 直接跑是否返回預期行數?
  • resultMap 是否有 <id> 且列名與 SQL 別名一致?
  • 實體類 equals/hashCode 是否基於主鍵實現?
  • 是否誤用 resultType 而非 resultMap?

補全主鍵映射後,MyBatis 能正確識別每條主記錄,一對多結果即可完整返回。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved