为了账号安全,请及时绑定邮箱和手机立即绑定

从 Java ResultSet 返回值时出现的问题

从 Java ResultSet 返回值时出现的问题

慕森卡 2021-11-17 10:32:41
出于某种原因,我只返回 1 个条目,但我有 2 个待处理的用户。public Set getApplicationStatus() {        DbConn connector = new DbConn();        String Pending = "Pending";        Connection connection = connector.getConnection();        try {            Statement stmt = connection.createStatement();            ResultSet rs = stmt.executeQuery("SELECT * FROM `person` WHERE `Department` = '"+Pending+"'");            Set persons = new HashSet();                        while (rs.next()) {                Person person = extractUserFromResultSet(rs);                persons.add(person);               }            System.out.println(persons.size());            return persons;        } catch (SQLException ex) {            ex.printStackTrace();        }        return null;如果我直接在数据库上运行查询,我会得到两个帐户,但如果我通过,ResultSet我似乎只得到最后一个。public static Person p = new Person();public static ArrayList<Person> Users = new ArrayList();public boolean WriteTOfile() throws IOException {    try (Writer writer = new FileWriter("Output.json")) {        Gson gson = new GsonBuilder().create();        Users = p.getApplicationStatus();        for (Person User : Users) {            String json = gson.toJson(User);            writer.write(json);        }    }    return true;}当我写入我的 Json 文件时,它会将最后一行添加两次? public ArrayList<Person> getApplicationStatus() {    DbConn connector = new DbConn();    String Pending = "Pending";    Connection connection = connector.getConnection();    try {        Statement stmt = connection.createStatement();        ResultSet rs = stmt.executeQuery("SELECT * FROM `person` WHERE `Department` = '"+Pending+"'");        ArrayList persons = new ArrayList();        while (rs.next()) {            Person person = extractUserFromResultSet(rs);            persons.add(person);           }        //System.out.println("Persons Size: " + persons.size());        return persons;    } catch (SQLException ex) {        ex.printStackTrace();    }    return null;}
查看完整描述

1 回答

?
幕布斯6054654

TA贡献1876条经验 获得超7个赞

我不确定你在哪里声明了提取方法中的人。


但是在方法中本地声明一个应该可以解决手指交叉的问题。


所以我认为发生的事情是你宣布了一个全球性的人。你正在设置字段。所以有一个 person 对象,你只是在改变它的细节。当您将其添加到 arraylist 时,您将添加对同一个人的引用。所以最后你添加了 3 个对同一个 person 对象的引用。该 person 对象已将其字段设置为 db 中的最后一个条目。我希望这是有道理的。


我得出这个结论的原因是当你打印这个人时,我让你在 rs.next 循环中做的 println 打印相同的引用。进行下面的更改后,您将看到引用发生了变化。因为您每次都创建一个新人并返回该新人对象,然后将对该对象的引用添加到数组列表中。


private Person extractUserFromResultSet(ResultSet rs) throws SQLException { 


    // add this line below

    Person person = new Person();


    person.setId(rs.getInt("ID"));

    person.setFName(rs.getString("FName")); 

    person.setLName(rs.getString("LName")); 

    person.setDOB(rs.getString("DOB")); 

    person.setDepartment(rs.getString("Department")); 

    person.setLocation(rs.getString("Location")); 

    person.setCellNr(rs.getString("Cellnr")); 

    person.setUsername(rs.getString("Username")); 

    person.setPassword(rs.getString("Password"));

    return person;

}


查看完整回答
反对 回复 2021-11-17
  • 1 回答
  • 0 关注
  • 189 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信