将ResultSet转换为DTO具有意外结果

时间:2012-01-07 12:34:31

标签: java hash resultset

编辑:忘记了可能导致问题的一行代码(夜间睡眠有帮助;)

好吧已经很晚了,所以我可能会遗漏一些基本的东西,但这是我的问题:

我查询了我的数据库,得到了一个如下所示的数据集:

retail_store_id basket_item_id  price_txt
1           2       8.99
1           1       1.5
1           6       11.09
1           4       3.99
2           6       10.99
2           2       9
2           1       1.79
3           4       2.99
3           1       1.5
4           1       1.39
4           6       9.99
4           4       3.5
4           2       7.99

现在我有一个包含List项目的Store类,每个basketitem都有价格。

现在要把它变成我的dto,我这样做:

    Map<Integer, Store> shoppedBasketHash = new HashMap<Integer, Store>();
    while (rs.next()){
            int storeID = rs.getInt("retail_store_id");

            basketItem = new BasketItem();
                            basketItem = GlobalHashOfItems.get(rs.getInt("basket_item_id"));
            basketItem.price = new BigDecimal(rs.getString("price_txt"));

            if(shoppedBasketHash.containsKey(storeID)){
                shoppedBasketHash.get(storeID).items.add(basketItem);                   
            }else{

                Store store = new Store();
                store.retailStoreID = rs.getInt("retail_store_id");

                store.items = new ArrayList<BasketItem>();
                store.items.add(basketItem);

                shoppedBasketHash.put(storeID, sb);
            }
        }
   return new ArrayList<Store>(shoppedBasketHash.values());

现在出于某种原因,稍后当我拿这份清单时:

    for(Store s: listOfStores){
        for(BasketItem b: s.items){
                         System.out.println(b.price);
                    }
        }

我明白了: 9.99

3.5

7.99

1.39

1.39

9.99

7.99

1.39

3.5

3.5

7.99

1.39

9.99

这与我参加的价格清单不一样。我做错了什么?

我现在意识到问题出在了     basketItem = GlobalHashOfItems.get(rs.getInt(“basket_item_id”));

我有一个项目的散列(没有价格),其中包含未从我需要使用的数据库中提取的其他项目信息,然后也添加价格。但它不是通过使用对象引用的值进行复制。如何将basketItem分配给GlobalHashOfItems项的值而不是引用?

1 个答案:

答案 0 :(得分:0)

您的问题是,当HashMap转换为ArrayList以从您的方法返回时,ArrayList不会保留插入/迭代顺序。

您可以通过构建Map来使用{{1}}进行添加来解决此问题。

另一种方法是使用保留插入/迭代顺序的LinkedHashMap