Java 在结果集上迭代时的奇怪行为
我试图迭代查询的结果集,但是我得到了一些无法解释的奇怪行为。我已经在线和离线搜索了几个小时了,我希望你们中的一位能够看到是什么导致了它,或者可能知道是什么导致了它 我正在使用Maven、JEE和JDBC 在对MySQL数据库运行查询之后,我尝试对其进行迭代,并将DTO(数据传输对象)添加到列表中Java 在结果集上迭代时的奇怪行为,java,jdbc,Java,Jdbc,我试图迭代查询的结果集,但是我得到了一些无法解释的奇怪行为。我已经在线和离线搜索了几个小时了,我希望你们中的一位能够看到是什么导致了它,或者可能知道是什么导致了它 我正在使用Maven、JEE和JDBC 在对MySQL数据库运行查询之后,我尝试对其进行迭代,并将DTO(数据传输对象)添加到列表中 class PersonDTO { private String name; public String getName() { return name; }
class PersonDTO {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
我在其中迭代结果的类使用CDI注入PersonDTO
我可以毫无问题地进行查询,但此处出现错误(rs是结果集:
List<PersonDTO> persons = new ArrayList<>();
while(rs.next())
String name = rs.getString("name");
System.out.println("Current name: " + name);
PersonDTO.setName(name);
persons.add(playlistDTO);
}
但是,在persons数组中,内容是Doris,Doris(第二个名字两次)。您正在覆盖同一
PersonDTO
对象的名称并多次将其添加到列表中。相反,您应该为循环的每次迭代创建一个新的PersonDTO
对象:
List<PersonDTO> persons = new ArrayList<>();
while(rs.next())
String name = rs.getString("name");
PersonDTO personDTO = new PersonDTO(); // Or use some injected factory
personDTO.setName(name);
persons.add(personDTO);
}
List persons=new ArrayList();
while(rs.next())
字符串名称=rs.getString(“名称”);
PersonDTO PersonDTO=新的PersonDTO();//或使用一些注入工厂
personDTO.setName(名称);
添加(personDTO);
}
您正在覆盖同一PersonDTO
对象的名称并多次将其添加到列表中。相反,您应该为循环的每次迭代创建一个新的PersonDTO
对象:
List<PersonDTO> persons = new ArrayList<>();
while(rs.next())
String name = rs.getString("name");
PersonDTO personDTO = new PersonDTO(); // Or use some injected factory
personDTO.setName(name);
persons.add(personDTO);
}
List persons=new ArrayList();
while(rs.next())
字符串名称=rs.getString(“名称”);
PersonDTO PersonDTO=新的PersonDTO();//或使用一些注入工厂
personDTO.setName(名称);
添加(personDTO);
}
成功了!你能解释一下你所说的注入工厂是什么意思吗?我不应该使用新的关键字,而是注入所有东西。@PietHein我的意思是,你可以注入一些PersonDTOFactory
或PersonDTOSupplier
,或者一些允许你创建PersonDTO的对象,而不是注入PersonDTO
实例。在任何地方都不使用new关键字的情况下,有什么方法可以做到这一点吗?@PietHein您需要为每个人创建一个新对象。在某个地方,必须调用new
。这很有效!您能解释一下注入工厂的含义吗?我不应该使用new关键字,而是注入所有内容。@PietHein我的意思是这样的关于注入PersonDTO
,你可以注入一些PersonDTOFactory
或PersonDTOSupplier
,或一些允许你创建PersonDTO
实例的对象。有没有办法在不使用新关键字的情况下做到这一点?@pie在其中,你需要为每个人注入一个新对象。在某个地方,必须调用一些东西新建
。