首页 > 解决方案 > 迭代 ResultSet 时的奇怪行为

问题描述

我正在尝试从查询中迭代结果集,但我遇到了一些我无法解释的奇怪行为。我已经在线和离线搜索了几个小时,我希望你们中的一个人能看到是什么原因造成的,或者可能知道是什么原因造成的。

我正在使用 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 是 ResulSet:

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);
}

我的控制台显示正确的结果:

name: Jack
name: Doris

但是在persons数组中的内容是Doris,Doris(第二个名字两次)。

标签: javajdbc

解决方案


您正在覆盖同一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);
}

推荐阅读