2013-04-26 311 views
-3

我創建了一個名爲Reservations的簡單表,該表包含以下列:ID,DUE_DATE,PRODUCTS_PAID,RESERVATION_NAME,SALE,TOTAL_SELL_PRICE和CUSTOMER_ID。while循環不會停止循環Java

現在我想要做的是我想遍歷CUSTOMER_ID給定值的表。這裏是我的方法,通過CUSTOMER_ID收集所有這些列中的數據:

public Collection<Reservations> findReservation(int cuID) { 
    EntityManager em = getEntityManager(); 
    Query q = em.createQuery("SELECT r FROM Reservations r WHERE r.customerData.id = :cID"); 
    q.setParameter("cID", cuID); 
    List results = q.getResultList(); 
    return results; 
} 

我在這裏的問題是,每當我跑迭代循環就不會停止迭代,但它繼續重複。我在該表中只有兩行數據。你能告訴我爲什麼這個迭代繼續下去,不會停止嗎?顯然,我只是想根據給定的CUSTOMER_ID值迭代該表內的所有數據。

我已經嘗試過循環,每個循環,while while循環和非它們的作品。它必須與我的代碼有關。這裏是一個while循環,我測試了,但休息一下就好了循環就不會停止迭代:

 for(Iterator itr2 = rd.findReservation(cuID).iterator(); itr2.hasNext();){ 
     rModel.addRow(Arrays.asList(rd.findReservation(cuID).iterator().next().getId(), 
       rd.findReservation(cuID).iterator().next().getReservationName(), 
       rd.findReservation(cuID).iterator().next().getCustomerData().getCustomerName(), 
       rd.findReservation(cuID).iterator().next().getCustomerData().getCustomerType(), 
       rd.findReservation(cuID).iterator().next().getDueDate(), 
       rd.findReservation(cuID).iterator().next().getTotalSellPrice(), 
       rd.findReservation(cuID).iterator().next().getSale(), 
       rd.findReservation(cuID).iterator().next().getProductsPaid(), 
       "Print")); 
    } 

如果你不知道什麼是CUID,它只是這是從表列獲得一個整數值。這個值是customerID。它運作良好。所以它不應該影響代碼。所有幫助表示讚賞:)

+0

這'rd.findReservation(CUID).iterator()的next()'給你的第一個結果從這個集合中的每個時間。你確定你不是每個結果,不是一次又一次? – 2013-04-26 10:00:21

+0

我知道如何返回單個或結果列表。這不是問題,我知道.next()只會返回下一個和單個元素,除非您在迭代中使用它。 – 2013-04-26 15:21:56

+0

在這種情況下,您每次都會重新開始,所以next()只會返回第一個,無論您循環多少次。順便說一句,您還在執行查詢併爲每個字段重新開始,對於已經非常昂貴的操作來說,總的來說,這種操作效率不高。 – 2013-04-26 15:24:27

回答

1

你需要做這樣的事情: -

for(Reservations res : rd.findReservation(cuID)){ 
    // Do whatever you want with this object(res) 
    rModel.addRow(Arrays.asList(res.getId(), res.getReservationName()...); 
} 

這是乾淨和簡單!不需要以你使用過的奇怪的方式使用迭代器,它只是不斷獲得一個新的迭代器,並繼續從中獲取第一個條目,因此導致循環爲infinite

+0

是的,這工作得很好:)。感謝您的幫助 :) – 2013-04-26 15:25:44

2

因爲您不要在循環中聲明iterator上的next。試試這個:

for(Iterator itr2 = rd.findReservation(cuID).iterator(); itr2.hasNext();){ 
    MyObject obj = itr2.next(); 
    rModel.addRow(Arrays.asList(obj.getId(), 
           obj.getReservationName(), 
           obj.getCustomerData().getCustomerName(), 
           obj.getCustomerData().getCustomerType(), 
           obj.getDueDate(), 
           obj.getTotalSellPrice(), 
           obj.getSale(), 
           obj.getProductsPaid(), 
           "Print")); 
} 
1

您使用兩個單獨的迭代器。你做的是這樣的:

while (iterator1.hasNext()) { 
    iterator2.next(); 
} 

顯然你不會耗盡iterator1。使用相同的迭代器,你的循環和rModel行:

Iterator it = rd.findReservation(cuID).iterator(); 
    while (it.hasNext()) { 
    // or whatever your type is 
    Object next = it.next(); 

    rModel.addRow(Arrays.asList(next.getId(), 
      next.getReservationName(), 
      next.getCustomerData().getCustomerName(), 
      next.getCustomerData().getCustomerType(), 
      next.getDueDate(), 
      next.getTotalSellPrice(), 
      next.getSale(), 
      next.getProductsPaid(), 
      "Print")); 
}