编辑:忘了一行代码,很可能导致该问题的(一夜的睡眠帮助;)转换的ResultSet的DTO有意想不到的结果
确定它的晚,所以我可能失去了一些东西在这里根本,但这是我的问题:
我有我的查询DB和获得的数据集是这样的:
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
现在我有包含列表项的存储类和每个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”));
我有一个项目(不包括价格)的哈希值,其中包含不从,我需要用再加入价格太高的DB拉到其他项目信息。但它不是通过值使用对象引用进行复制。我如何让basketItem分配给GlobalHashOfItems项的值而不是引用?
谢谢,我认为我的return语句之前可能是一个问题,我从来没有使用的值()。 但是我试过这个: \t \t'List stores = new ArrayList (); \t \t设置 keys = shoppedBasketHash.keySet(); (Integer i:钥匙){ \t \t \t stores.add(shoppedBasketHash.get(i)); \t \t} \t \t \t \t回店;' \t \t 我仍然得到同样的结果 –
2012-01-07 23:51:01
@PiersMacDonald,你可以尝试从同一问题的困扰;迭代(未排序)'Map'和'Set'按随机顺序排列。如果您的目标是重现resulset的序列,那么当您将商店放入地图时,请添加到'ArrayList'。如果你的目标是按键值对结果进行排序(就像你上面的尝试),你可以通过使用像TreeMap这样的有序地图来实现它。 (当然,store.items()的iteratino序列也是如此)。 – rsp 2012-01-08 09:58:00