2016-07-27 4 views
1

このコード例では、データベースから2つのレコードを取得しており、そのデータはというsmsDTOオブジェクトに設定されています。もし私が最初のレコードの代わりに最後のレコードを2回印刷する別のクラスのこのArrayListを反復すると、あなたは、SAMを挿入するループリスト内のユーザー定義オブジェクトが正しく反復されない

ながら、あなたはSmsDTO sms = new SmsDTO();内部を作成する必要が

Databaseクラス

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; 
      } 
     } 

別のクラス

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

ループが間違っているとは限りません。単純に 'SmsDTO 'のインスタンスを何度も繰り返して(' sms'は決して再割り当てされません)、その間にこのインスタンスを変更してください。したがって、 'List'には' SmsDTO'の同じインスタンスが 'x'倍だけ残されています。このインスタンスには、最後に反復されたデータベース行のデータがあります。 – SomeJavaGuy

+0

あなたは正しいです –

答えて

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

eオブジェクトを配列リストに2回追加します。したがって、最後に更新された値は同じオブジェクト内に存在します(同じ参照のため)。

whileループで新しいオブジェクトを作成すると、最初のレコードが最初のオブジェクトに移動し、2番目のレコードが新しく作成された2番目のオブジェクトに移動します。 (同じオブジェクトではない)。

+0

もし私が自動的にハイバネートを使用するなら、それでリストに問題はありません。 –

+0

はい。正しいです。あなたがSpring Spring-data-jpaの良い選択肢だと思ったら – Suranga

+0

誰もこれに対して休止状態のコードを表示できますか? –

関連する問題