2013-04-26 2 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; 
} 

여기 내 문제는 내가 반복 루프를 실행할 때마다 그것을 반복하는 멈추지 않을 것입니다하지만이 반복하고 있습니다. 나는 그 테이블에 2 행의 데이터 만 가지고있다. 이 반복이 왜 계속되고 멈추지 않을지 말해 줄 수 있습니까? 분명히 주어진 CUSTOMER_ID 값을 기반으로 해당 테이블 내부의 모든 데이터를 반복하고 싶습니다.

나는 각 루프마다 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() 다음은()'이 컬렉션에서 당신에게 모든 시간을 첫 번째 결과를 제공합니다. 당신은 각각의 결과가 아니라고 확신합니까? –

+0

단일 또는 결과 목록을 반환하는 방법을 알고 있습니다. 그게 문제가 아니에요 .next()는 반복의 내부에서 사용하지 않는 한 다음 요소와 단일 요소 만 반환합니다. –

+0

이 경우 반복 할 때마다 next()가 처음 루프를 반환 할 때마다 매번 다시 시작합니다. BTW 또한 쿼리를 수행하고 이미 비싸고, 전체적으로, 마음이 부 풀리는 비효율적 인 작업을 위해 각 필드에 대해 다시 시작합니다. –

답변

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

네, 이것은 매우 잘 작동했습니다 :). 도와 줘서 고마워. :) –

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")); 
} 
관련 문제