很久沒有積累東西了,碰巧前幾天遇到一個的問題,雖然不大但是比較有意思,在這里稍微記錄一下,以后可以作為
面試題之類的考驗
其他人,想想也遠比那些被我們詬病的題目要實際的多:
有表結構如下:
T_SOME_TABLE{ crowid varchar(36); zrmb float(7,3); zjdw float(7,3); } |
問以下兩段代碼,哪段會出現錯誤,為什么?
代碼片段一:
String hqlStr="select SUM(t.zrmb) AS SUM_1,SUM(t.zjdw) AS SUM_2 from T_SOME_TABLE t where 1=1 "; List sumList=baseDao.find(hqlStr); request.setAttribute("sumList",sumList); String sum1=""; String sum2=""; ArrayList sumList=request.getAttribute("sumList")==null?null:(ArrayList)request.getAttribute("sumList"); if(null!=sumList){ for(int i=0;i<sumList.size();i++){ Object[] tempObj=(Object[])sumList.get(i); sum1=tempObj[0]==null?"0.0":tempObj[0].toString(); sum2=tempObj[1]==null?"0.0":tempObj[1].toString(); } } out.prinln("sum1:"+sum1); out.prinln("sum2:"+sum2); |
代碼片段二:
String hqlStr="select SUM(t.zrmb) AS SUM_1 from T_SOME_TABLE t where 1=1 "; List sumList=baseDao.find(hqlStr); request.setAttribute("sumList",sumList); String sum1=""; ArrayList sumList=request.getAttribute("sumList")==null?null:(ArrayList)request.getAttribute("sumList"); if(null!=sumList){ for(int i=0;i<sumList.size();i++){ Object[] tempObj=(Object[])sumList.get(i); sum1=tempObj[0]==null?"0.0":tempObj[0].toString(); } } out.prinln("sum1:"+sum1); |
實際運行會發現 代碼片段2會出現錯誤 而代碼片段1是正??梢赃\行的,這里是在功能開發過程中 片段2是在片段1的基礎上慣性思維去實現的,而實際運行卻會發現 結果并不是想要的那樣,這個動手能力強的人可以實際調試一下就會很快明白里面的所以然。這里簡單說一下:
做過hibernate的人都知道 用hibernate調用sql查詢出的匯總語句,返回的結果是封裝成Object的保存到List中的,而代碼1和代碼2相比較,差別只是在字段的多少上,如果是2個以上的字段 結果是封裝成Object[]數組的,這個無可爭議,但是如果是一個字段的話List里保存的是Object,而不是Object[]數組。
這樣就可以推論這里hibernate內部是做了處理的。
代碼2循環中應該是:
Object tempObj=(Object)sumList.get(i); sum1=tempObj==null?"0.0":tempObj.toString(); |