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

MyBatis Collection 關聯查詢不執行的排查與解決

     編輯:程式設計疑難解答

問題現象

MyBatis <collection> 配置嵌套查詢,主查詢執行正常,但關聯的 select="findStudent" 從未被調用。

配置分析

<select id="findGrade" parameterType="int" resultMap="test">
    select * from grade where id=#{id}
</select>

<resultMap id="test" type="com.hs.Entity.Grade">
    <collection property="student" javaType="list" ofType="com.hs.Entity.Student" 
                select="findStudent" column="gradeId"/>
</resultMap>

<select id="findStudent" parameterType="int" resultType="com.hs.Entity.Student">
    selcet * from student where id=#{id}  -- 拼寫錯誤:selcet
</select>

常見失效原因排查清單

1. SQL 拼寫錯誤(本例核心問題)

selcet → select,導致語句解析失敗,MyBatis 靜默忽略或拋異常被吞噬。

2. 參數映射不匹配

  • column="gradeId" 必須與主查詢結果集列名一致(或別名)。
  • 嵌套查詢 parameterType 需與傳入參數類型一致(此處為 int)。

3. 延遲加載配置

<settings>
    <setting name="lazyLoadingEnabled" value="true"/>
    <setting name="aggressiveLazyLoading" value="false"/>
</settings>

若 lazyLoadingEnabled=false,集合會立即加載;為 true 時需觸發 getter 才查詢。測試時需調用 grade.getStudent()。

4. 結果映射衝突

  • property="student" 需與實體類字段名完全一致(含大小寫)。
  • ofType 指定泛型類型,需為全限定名或別名。

5. 命名空間問題

select="findStudent" 若不在同一 mapper 命名空間,需寫全限定 ID:namespace.findStudent。

修正後配置

<mapper namespace="com.hs.mapper.GradeMapper">
    <select id="findGrade" parameterType="int" resultMap="test">
        select id, name, grade_id as gradeId from grade where id=#{id}
    </select>

    <resultMap id="test" type="com.hs.Entity.Grade">
        <id property="id" column="id"/>
        <result property="name" column="name"/>
        <collection property="student" javaType="ArrayList" ofType="com.hs.Entity.Student"
                    select="findStudent" column="gradeId"/>
    </resultMap>

    <select id="findStudent" parameterType="int" resultType="com.hs.Entity.Student">
        select * from student where grade_id = #{id}
    </select>
</mapper>

調試技巧

  • 開啟 MyBatis 日誌(Log4j/Slf4j + debug 級別),觀察 SQL 執行情況。
  • 單獨測試 findStudent 語句,驗證 SQL 正確性。
  • 檢查實體類 Grade.student 字段是否有 @Setter 或公共 setter 方法。

總結

MyBatis <collection> 不執行多由SQL 語法錯誤、參數映射不匹配、延遲加載未觸發、命名空間缺失導致。本例核心是嵌套查詢 SQL 寫成 selcet。排查時按:SQL 語法 → 參數映射 → 加載策略 → 命名空間 → 實體映射 順序逐項驗證,開啟調試日誌可事半功倍。

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