一候衍、問題背景
查詢語句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中顯示信息正常
image
通過程序?qū)⒉樵兊臄?shù)據(jù)信息轉(zhuǎn)換成Java類時障本,類中的屬性全部都是null
image
二颓影、問題探索
通過mysql中查出來的信息妨托,應(yīng)該會將字段信息映射到Java類的屬性中,但是好像并不是這么回事朱沃,只有深入到源碼中查詢一下問題所在髓霞,如下圖
image
代碼中是通過DAORowMapper類將mysql中查詢的字段信息映射到Java類的屬性中,繼續(xù)深入了解這個類
image
繼續(xù)向下看這個方法瘦锹,下圖中標(biāo)出了關(guān)鍵的地方籍嘹,為什么沒有執(zhí)行類中的setter方法
image
繼續(xù)向下查看,就是通過反射將查詢出的字段信息set到映射類的屬性中
image
目前將字段信息映射到Java類中屬性的關(guān)鍵代碼地址找到了弯院,debugger查看name值為"city_unit_name"并不是as之后的別名"disposeunitname"
image
繼續(xù)深入發(fā)現(xiàn)這邊有一個判斷邏輯辱士,通過useOldAliasBehavior走哪個業(yè)務(wù)邏輯,默認(rèn)為false听绳,通過getNameNoAliases方法獲取字段名
image
查看該方法得知獲取的字段名是originalName
image
debug得知ResultSetMetaData類的內(nèi)部屬性信息
image
從上面截圖中發(fā)信name是我們需要獲取的字段別名颂碘,查看下圖 我們應(yīng)該走上面的判斷邏輯通過this.getField(column).getName()
獲取字段別名,因此需要將useOldAliasBehavior設(shè)置為true
image
三椅挣、問題解決
通過查詢mysql的相關(guān)資料得知獲取字段的別名有兩種方法头岔,
一種通過方法ResultSetMetaData.getColumnLabel(),如下圖
第二種是配置useOldAliasMetadataBehavior值為true鼠证,通過ResultSetMetaData.getColumnName()獲取峡竣,該字段是通過數(shù)據(jù)庫屬性url來進(jìn)行配置的,通過下面的配置可以將該字段賦值為true
jdbc.url=jdbc:mysql://localhost:3306/egovastat?useOldAliasMetadataBehavior=true
修改完畢之后量九,查詢的數(shù)據(jù)信息能夠映射到Java類的屬性中适掰,到這里該問題成功解決
image
四、題外話
通過這次問題探索和問題解決,感觸較深攻谁。我們對于一些框架的源碼應(yīng)該放下敬畏之心報以平常的心態(tài)查看源碼稚伍,通過查看源碼來解決問題。這種方法看似困難戚宦,其實是最簡單个曙、最高效。同時受楼,以后也要多多查看優(yōu)秀的源碼垦搬,學(xué)習(xí)別人的設(shè)計思想和代碼習(xí)慣。