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

出于某种原因,我只返回 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我似乎只得到最后一个。

http://img.mukewang.com/619469db0001b0f302090038.jpg

http://img3.mukewang.com/619469e30001c8cc04230073.jpg

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;

}


慕森卡
浏览 190回答 1
1回答

幕布斯6054654

我不确定你在哪里声明了提取方法中的人。但是在方法中本地声明一个应该可以解决手指交叉的问题。所以我认为发生的事情是你宣布了一个全球性的人。你正在设置字段。所以有一个 person 对象,你只是在改变它的细节。当您将其添加到 arraylist 时,您将添加对同一个人的引用。所以最后你添加了 3 个对同一个 person 对象的引用。该 person 对象已将其字段设置为 db 中的最后一个条目。我希望这是有道理的。我得出这个结论的原因是当你打印这个人时,我让你在 rs.next 循环中做的 println 打印相同的引用。进行下面的更改后,您将看到引用发生了变化。因为您每次都创建一个新人并返回该新人对象,然后将对该对象的引用添加到数组列表中。private Person extractUserFromResultSet(ResultSet rs) throws SQLException {&nbsp;&nbsp; &nbsp; // add this line below&nbsp; &nbsp; Person person = new Person();&nbsp; &nbsp; person.setId(rs.getInt("ID"));&nbsp; &nbsp; person.setFName(rs.getString("FName"));&nbsp;&nbsp; &nbsp; person.setLName(rs.getString("LName"));&nbsp;&nbsp; &nbsp; person.setDOB(rs.getString("DOB"));&nbsp;&nbsp; &nbsp; person.setDepartment(rs.getString("Department"));&nbsp;&nbsp; &nbsp; person.setLocation(rs.getString("Location"));&nbsp;&nbsp; &nbsp; person.setCellNr(rs.getString("Cellnr"));&nbsp;&nbsp; &nbsp; person.setUsername(rs.getString("Username"));&nbsp;&nbsp; &nbsp; person.setPassword(rs.getString("Password"));&nbsp; &nbsp; return person;}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java