2017-08-09 14 views
3

結果セット(DBクエリ値)を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

あなたが投稿したコードは、最初の2行に余分な '<>'を入れています。私はあなたの質問に基づいて私はあなたのコードはコンパイルを渡すと仮定して以来、これはtypoと仮定しています。 – Eran

+0

Thatsコピー貼りのエラー:D –

答えて

2

同じLinkedHashMapインスタンス(rowData変数で参照される)を外側のMapに複数回入れています。これが最終的な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つのマップを作成し、「行」の繰り返しごとに更新されます。そして最後に、同じマップを外側のマップに配置します。

+1

いくつかのコードを追加するか、コメントを追加する – Abdelhak

+0

そしてなぜですか?真剣に:データベースを扱う人は、説明があれば2分以内にコードを書くことができるはずです。 – GhostCat

+0

ありがとう!出来た。私は、結果セットのループ内にrowdataマップを宣言しました。それで、すべての反復をインスタンス化します –

関連する問題