一、問題背景
查詢語句sql:"select b.city_unit_name as disposeunitname,a.city_event_src_name as eventsrcname from to_stat_info t,to_trans_event_src a,to_trans_unit b where t.event_src_name=a.event_src_name and t.dispose_unit_name = b.unit_name"查詢MySQL中顯示資訊正常
通過程式將查詢的資料資訊轉換成Java類時,類中的屬性全部都是null
二、問題探索
通過MySQL中查出來的資訊,應該會將欄位資訊對映到Java類的屬性中,但是好像並不是這麼回事,只有深入到原始碼中查詢一下問題所在,如下圖
程式碼中是通過DAORowMapper類將mysql中查詢的欄位資訊對映到Java類的屬性中,繼續深入瞭解這個類
繼續向下看這個方法,下圖中標出了關鍵的地方,為什麼沒有執行類中的setter方法
繼續向下檢視,就是通過反射將查詢出的欄位資訊set到對映類的屬性中
目前將欄位資訊對映到Java類中屬性的關鍵程式碼地址找到了,debugger檢視name值為"city_unit_name"並不是as之後的別名"disposeunitname"
繼續深入發現這邊有一個判斷邏輯,通過useOldAliasBehavior走哪個業務邏輯,預設為false,通過getNameNoAliases方法獲取欄位名
檢視該方法得知獲取的欄位名是originalName
debug得知ResultSetMetaData類的內部屬性資訊
從上面截圖中發信name是我們需要獲取的欄位別名,檢視下圖 我們應該走上面的判斷邏輯通過this.getField(column).getName() 獲取欄位別名,因此需要將useOldAliasBehavior設定為true
三、問題解決
一種通過方法ResultSetMetaData.getColumnLabel(),如下圖 第二種是配置useOldAliasMetadataBehavior值為true,通過ResultSetMetaData.getColumnName()獲取,該欄位是通過資料庫屬性url來進行配置的,通過下面的配置可以將該欄位賦值為true通過查詢MySQL的相關資料得知獲取欄位的別名有兩種方法,
jdbc.url=jdbc:mysql://localhost:3306/egovastat?useOldAliasMetadataBehavior=true
複製程式碼
修改完畢之後,查詢的資料資訊能夠對映到Java類的屬性中,到這裡該問題成功解決
四、題外話
通過這次問題探索和問題解決,感觸較深。我們對於一些框架的原始碼應該放下敬畏之心報以平常的心態檢視原始碼,通過檢視原始碼來解決問題。這種方法看似困難,其實是最簡單、最高效。同時,以後也要多多檢視優秀的原始碼,學習別人的設計思想和程式碼習慣。