Преобразование ResultSet в DTO имеет неожиданный результат - PullRequest
0 голосов
/ 07 января 2012

РЕДАКТИРОВАТЬ: забыл строку кода, которая, вероятно, является причиной проблемы (сон ночи помог;)

Хорошо, уже поздно, поэтому я, вероятно, упускаю что-то фундаментальное, но это моя проблема:

Я запросил свою базу данных и получил набор данных, который выглядит следующим образом:

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

Теперь у меня есть класс Store, который содержит элементы списка, и каждый элемент корзины имеет цену.

Теперь, чтобы получить это в моем 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 голосов
/ 07 января 2012

Ваша проблема в том, что HashMap не сохраняет порядок вставки / итерации, когда он конвертируется в ArrayList для возврата из вашего метода.

Вы можете решить эту проблему, создав ArrayList для возвратапри использовании Map для добавления.

Другим способом было бы использование LinkedHashMap , который сохраняет порядок вставки / итерации.

...