2017-08-09 32 views
3

我試圖將結果集(數據庫查詢值)放入LinkedHashMap>中。試圖將結果集值放入映射內

每行迭代。該值在放入DBMap時被覆蓋。

<LinkedHashMap<String, String>> rowData = new LinkedHashMap<>(); 
<LinkedHashMap<Integer, LinkedHashMap<String, String>>> dbData = new LinkedHashMap<>(); 
while (rset.next()) { 

        for (int col = 1; col < countCol+1; col++) { 
         String colname =rset.getMetaData().getColumnName(col); 
         rowData.put(colname, rset.getString(col)); 
        } 
        int rowV = rset.getRow(); 
        dbData.put(rowV, rowData); 
} 

此代碼是給我的只有結果爲dbData地圖的所有鍵設定的最後一排的地圖。

+0

我剛剛發佈了必填的代碼,它將在這裏回答我的問題。 @RobbyCornelissen –

+0

請注意您發佈的代碼在前兩行中有額外的'<>'。我假設這是一個錯字,因爲基於你的問題,我認爲你的代碼通過編譯。 – Eran

+0

這就是複製粘貼錯誤:D –

回答

2

您在外部Map中多次放入相同的LinkedHashMap實例(由rowData變量引用)。這就是最終DB行的值覆蓋所有以前的值的原因。

您必須爲while循環的每個迭代創建一個新的LinkedHashMap實例:

LinkedHashMap<Integer, LinkedHashMap<String, String>> dbData = new LinkedHashMap<>(); 
while (rset.next()) { 
    LinkedHashMap<String, String> rowData = new LinkedHashMap<>(); 
    for (int col = 1; col < countCol+1; col++) { 
     String colname =rset.getMetaData().getColumnName(col); 
     rowData.put(colname, rset.getString(col)); 
    } 
    int rowV = rset.getRow(); 
    dbData.put(rowV, rowData); 
} 
+0

不知道誰給你downvote。你給出了代碼示例,我給出了一個解釋。 – GhostCat

0

簡單:你只有一個 rowData地圖 - 即獲取與行數據更新。

您必須創建一個新鮮的地圖,而不是每行!

換言之:您當前的代碼創建了一個地圖,該地圖會針對每個「行」迭代進行更新。最後,你把同樣的地圖放到你的外地圖上。

+1

添加一些代碼或添加評論 – Abdelhak

+0

爲什麼?嚴重:想要處理數據庫的人應該能夠在2分鐘內編寫該代碼,並給出解釋。 – GhostCat

+0

謝謝!有效。我剛剛在結果集循環內聲明瞭rowdata映射。所以它實例化每一次迭代 –