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;
}
这是使用hibernate框架从数据库获取信息的代码。我尝试使用以下代码在main中显示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());
}
}
预期输出为: 约翰 何塞 标记
但是得到的是: 标记 标记 标记
任何人都可以找到我的代码????
答案 0 :(得分: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 :(得分:0)
简而言之,您需要在while循环中创建一个新的EmployeeInfoPojo对象。否则,您所做的就是反复更改单个对象的属性。
答案 2 :(得分:0)
您的“emp_info”变量正在循环外创建,这意味着循环内的变量始终是同一个实例。当您将该实例放入列表时,它仍然是相同的实例。 (向列表添加内容会添加 实例,而不是副本。)
移动此行:
EmployeeInfoPojo emp_info = new EmployeeInfoPojo();
紧接在这一行之后:
lp = (loginPojo) it.next();
你会发现你的循环行为更像你期望的那样。
答案 3 :(得分: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每次循环时都会添加相同的对象。 因此,只有最后一个值反映在所有对象中(具有三个引用的单个对象)。
答案 4 :(得分:0)
std::mem::swap