将ResultSet转换为DTO时出现意外结果



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

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

我已经查询了我的数据库,得到了一个看起来像这样的数据集:

零售_商店_篮子_商品_价格_文本1 2 8.991 1 1.51 6 11.091 4 3.992 6 10.992 2 92 1 1.793 4 2.993 1 1.54 1 1.394 6 9.994 4 3.54 2 7.99

现在我有一个Store类,它包含一个List项目,每个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项的值而不是引用?

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

您可以通过在使用Map进行加法的同时构建要返回的ArrayList来解决此问题。

另一种方法是使用LinkedHashMap,它确实保留了插入/迭代顺序。

相关内容

  • 没有找到相关文章

最新更新