2012-03-20 52 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