Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在结果集上迭代时的奇怪行为_Java_Jdbc - Fatal编程技术网

Java 在结果集上迭代时的奇怪行为

Java 在结果集上迭代时的奇怪行为,java,jdbc,Java,Jdbc,我试图迭代查询的结果集,但是我得到了一些无法解释的奇怪行为。我已经在线和离线搜索了几个小时了,我希望你们中的一位能够看到是什么导致了它,或者可能知道是什么导致了它 我正在使用Maven、JEE和JDBC 在对MySQL数据库运行查询之后,我尝试对其进行迭代,并将DTO(数据传输对象)添加到列表中 class PersonDTO { private String name; public String getName() { return name; }

我试图迭代查询的结果集,但是我得到了一些无法解释的奇怪行为。我已经在线和离线搜索了几个小时了,我希望你们中的一位能够看到是什么导致了它,或者可能知道是什么导致了它

我正在使用Maven、JEE和JDBC

在对MySQL数据库运行查询之后,我尝试对其进行迭代,并将DTO(数据传输对象)添加到列表中

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在其中,你需要为每个人注入一个新对象。在某个地方,必须调用一些东西
新建