2012-03-20 85 views
0
public ArrayList getEmpInfo(int id) { 

     ArrayList data = new ArrayList(); 
     loginPojo lp=new loginPojo(); 
     EmployeeInfoPojo emp_info = new EmployeeInfoPojo(); 

     Session session = null; 
     SessionFactory sessionfactory = new Configuration().configure().buildSessionFactory(); 

     session = sessionfactory.openSession(); 

     String sql_query = "from loginPojo where id!=" + id; 
     Query query = session.createQuery(sql_query); 

     List<loginPojo> list = query.list(); 

     Iterator it = list.iterator(); 

     while (it.hasNext()) { 
      lp = (loginPojo) it.next(); 
      emp_info.setName(lp.getName()); 

      System.out.println("Before "+emp_info.getName()); 
      data.add(emp_info); 
      System.out.println("After "+emp_info.getName()); 
     } 
     return data; 
    } 

此的最後一個值是用於獲取使用所述休眠framework.I嘗試使用以下代碼來顯示在主ArrayList中從數據庫中的信息的代碼。ArrayList中僅顯示索引

public static void main(String args[]) { 
    EmployeeInfoPojo emip = null; 
    EmployeeInfo emi = new EmployeeInfo(); 
    ArrayList info = emi.getEmpInfo(102); 

    Iterator it = info.iterator(); 

    while (it.hasNext()) { 
     emip = (EmployeeInfoPojo) it.next(); 
     System.out.println(emip.getName()); 
    } 
} 

預期的輸出結果是: 約翰 何塞 馬克

但是我得到的是: 馬克 馬克 馬克

任何人都可以找我有什麼錯的代碼??? ?

回答

2

我認爲你需要更改下面的邏輯...

while (it.hasNext()) { 
     lp = (loginPojo) it.next(); 
     emp_info.setName(lp.getName()); 


     System.out.println("Before "+emp_info.getName()); 
     data.add(emp_info); 
     System.out.println("After "+emp_info.getName()); 
    } 

while (it.hasNext()) { 
      lp = (loginPojo) it.next(); 
      emp_info = new EmployeeInfoPojo();//create object here 
      emp_info.setName(lp.getName()); 
      System.out.println("Before "+emp_info.getName()); 
      data.add(emp_info); 
      System.out.println("After "+emp_info.getName()); 
     } 

因爲,正如你所添加的同一對象到ArrayList,它的取值爲您上次更新。

+1

面對同樣的問題。謝謝!你的代碼片段非常清晰! – alke2007 2017-10-22 13:08:34

0

簡而言之,您需要在while循環內創建一個新的EmployeeInfoPojo對象。否則,你所做的只是一遍又一遍地改變單個對象的屬性。

0

您的「emp_info」變量正在循環外部創建,這意味着循環內部的變量始終是相同的實例。當你把這個實例放入一個列表中時,它的仍然是的同一個實例。 (添加東西的清單增加了實例,而不是一個副本。)

移動這一行:

此行後
EmployeeInfoPojo emp_info = new EmployeeInfoPojo(); 

立刻道:

lp = (loginPojo) it.next(); 

,你應該找到你循環的行爲更像你期望的那樣。

0

您只需在方法getEmployeeInfo中創建EmployeeInfoPojo的單個對象。每次迭代列表時,都需要初始化ep_info。 迭代器的代碼應該是這樣的 -

 while (it.hasNext()) { 
    lp = (loginPojo) it.next(); 
    emp_info = new EmployeeInfoPojo 
    emp_info.setName(lp.getName()); 


    System.out.println("Before "+emp_info.getName()); 
    data.add(emp_info); 
    System.out.println("After "+emp_info.getName()); 
} 

在你前面的代碼中你只是單一的對象進行操作,這就是爲什麼當你改變這個對象舊值將覆蓋和ArrayList添加相同的對象,每次同時循環。 因此,只有最後一個值反映在所有對象(具有三個參考的單個對象)中。

0
public ArrayList getEmpInfo(int id) { 

      ArrayList data = new ArrayList(); 
      loginPojo lp=new loginPojo(); 
      Session session = null; 
      SessionFactory sessionfactory = new Configuration().configure().buildSessionFactory(); 
      session = sessionfactory.openSession(); 
      String sql_query = "from loginPojo where id!=" + id; 
      Query query = session.createQuery(sql_query); 
      List<loginPojo> list = query.list(); 
      Iterator it = list.iterator(); 
      while (it.hasNext()) { 
//you need to create new object or else it uses same object reference 
     EmployeeInfoPojo emp_info = new EmployeeInfoPojo(); 
       lp = (loginPojo) it.next(); 
       emp_info.setName(lp.getName());`enter code here` 
       System.out.println("Before "+emp_info.getName()); 
       data.add(emp_info); 
       System.out.println("After "+emp_info.getName()); 
      } 
      return data; 
     } 
+1

請爲你修正/爲什麼出現問題添加一點解釋。 – Loaf 2017-01-12 17:57:03