2016-07-27 7 views
1

In diesem Beispielcode erhalte ich zwei Datensätze aus der Datenbank, dann die Daten, die ich auf smsDTO Objekt gesetzt habe, das ich ArrayList gesetzt hatte. wenn ich diese ArrayList in einer anderen Klasse wiederholen, die das letzte Drucken zweimal statt des ersten Datensatzes aufzeichnet.Benutzerdefiniertes Objekt in der Liste wurde nicht richtig iteriert

Database-Klasse

public ArrayList<SmsDTO> getReulst() { 
       ResultSet rs = null; 
       Connection conn = null; 
       PreparedStatement pstmt = null; 
       ArrayList<SmsDTO> ar=new ArrayList<SmsDTO>() ; 
       SmsDTO sms = new SmsDTO(); 
       try { 

        conn = getConnection(); 
        String query = "select pt.P_MOBILE,st.S_FIRSTNAME,st.REF_ID from parent_info pt join student_info st on pt.REF_ID = st.REF_ID where st.S_CLASS_TO_JOIN = 10;"; 

        pstmt = conn.prepareStatement(query); // create a statement 
        rs = pstmt.executeQuery(); 
        // extract data from the ResultSet 
        while (rs.next()) { 

         long phone = rs.getLong(1); 
         sms.setPhone(phone); 
         String student_name = rs.getString(2); 
         sms.setStudentname(student_name); 
         String ref = rs.getString(3); 
         sms.setRef(ref); 
         ar.add(sms); 

        } 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } finally { 
        try { 
         rs.close(); 
         pstmt.close(); 
         conn.close(); 
        } catch (SQLException e) { 
         e.printStackTrace(); 
        } 
       } 
       return ar; 
      } 
     } 

Eine andere Klasse

method() 
{ 
    ArrayList<SmsDTO> lhst = null; 
    try { 
     lhst = db.getReulst(); 
     for (Iterator iterator = lhst.iterator(); iterator.hasNext();) { 
      SmsDTO smsDTO = (SmsDTO) iterator.next(); 
      System.out.println(smsDTO.getStudentname()); 
     } 
} 
+2

Es ist nicht so, dass es eine falsche Schleife gibt, Sie fügen die Instanz von SmsDTO einfach immer wieder hinzu (sms wird nie neu zugewiesen) und ändert diese Instanz in der Zwischenzeit. Sie haben also 'x' die gleiche Instanz von' SmsDTO' in der 'List', wo diese eine Instanz die Daten der letzten iterierten Datenbankzeile enthält. – SomeJavaGuy

+0

ya du hast Recht –

Antwort

0
public ArrayList<SmsDTO> getReulst() { 
     ResultSet rs = null; 
     Connection conn = null; 
     PreparedStatement pstmt = null; 
     ArrayList<SmsDTO> ar = new ArrayList<SmsDTO>(); 
     SmsDTO sms = null; 
     try { 

      conn = getConnection(); 
      String query = "select pt.P_MOBILE,st.S_FIRSTNAME,st.REF_ID from parent_info pt join student_info st on pt.REF_ID = st.REF_ID where st.S_CLASS_TO_JOIN = 10;"; 

      pstmt = conn.prepareStatement(query); // create a statement 
      rs = pstmt.executeQuery(); 
      // extract data from the ResultSet 
      while (rs.next()) { 
       sms = new SmsDTO(); 
       long phone = rs.getLong(1); 
       sms.setPhone(phone); 
       String student_name = rs.getString(2); 
       sms.setStudentname(student_name); 
       String ref = rs.getString(3); 
       sms.setRef(ref); 
       ar.add(sms); 

      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } finally { 
      try { 
       rs.close(); 
       pstmt.close(); 
       conn.close(); 
      } catch (SQLException e) { 
       e.printStackTrace(); 
      } 
     } 
     return ar; 

    } 
} 
0

Sie haben SmsDTO sms = new SmsDTO(); innen zu schaffen, während Schleife

Sie sam einfügen e Objekt zweimal in Array-Liste. Die letzten aktualisierten Werte sind also im selben Objekt (da es die gleiche Referenz ist).

Wenn Sie ein neues Objekt in der while-Schleife erstellen, wird der erste Datensatz zum ersten Objekt und der zweite Datensatz zum neu erstellten zweiten Objekt. (nicht für das gleiche Objekt).

+0

Wenn ich Hibernate automatisch verwende, gibt es List dann kein Problem richtig –

+0

ja .Sie haben Recht. Wenn Sie an Spring Spring denken-Daten-Jpa ist gute Option – Suranga

+0

kann jemand Hibernate-Code dafür zeigen –

Verwandte Themen