使用Mybatis自定義sql後返回的實體類部分屬性為null

2020-10-13 13:00:17

1-問題

在外掛生成的mapper.xml檔案中自己寫了新的sql,具體的程式碼如下:

<select id="pageQuery" resultType="com.QuestionTypeEntity">
...
</select>

寫完偵錯後,發現QuestionTypeEntity中typeName和createTime的值是null,其它屬性正常(有值)

2-可能的原因

返回實體中部分屬性有值,所以整體sql語法沒問題,所以可能的原因有:

  • 資料庫表中資料不全(開發時在開發環境資料變動的可能性比較大)
  • xml檔案中單詞拼寫錯誤或者和資料庫中欄位不一致了(團隊其他人修改了也有可能)
  • xml中標籤的用法有問題

3-分析與驗證

  • 檢查對應的資料庫表和記錄後發現不是資料的問題
  • 檢查拼寫確認無誤,對映的xml是外掛生成在表結構未發生改變時都是一致的,所以也沒問題。(這裡說下我自己檢查表結構和對映檔案是否一致的方法:表結構簡單時可以一一比對;欄位較多時可以再備份後,重新生成檔案,用整合工具的版本控制來檢查;還可以檢視檔案和表的更新時間來分析)
  • 最後檢查結果對映的resultType標籤,資料庫中欄位的命名多個單詞是以_隔開的而到了程式碼是駝峰的方式,resultType不能指定具體的屬性對映,必需完全一致才能對映

4-解決方法

  • 將resultType換成resultMap(推薦)
  • 將對應的entity中的屬性和資料庫表中的列取的完全一致(不推薦,命名規範不同,也不應該)

5-總結

在開發過程中,因為資料庫資料本身的不穩定性,所以當出現部分屬性缺失時,可以優先考慮和檢查是否資料不完整造成的,之後在考慮程式碼和組態檔的問題。

題外話

本文的目錄結構也是我解決問題的思考方式,覺得不錯的話可以借鑑一下,最後歡迎點贊,評論,收藏和轉發。