【问题标题】:Problem when returning values from Java ResultSet从 Java ResultSet 返回值时出现问题
【发布时间】:2018-10-13 22:49:50
【问题描述】:

由于某种原因,我只返回 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;
}

使用此代码解决的第一个问题

 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(person);
        }
        //System.out.println("Persons Size: " + persons.size());
        return persons;
    } catch (SQLException ex) {
        ex.printStackTrace();
    }
    return null;
}

先返回打印n

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);
            System.out.println(json);
            writer.write(json);
        }

    }
    return true;
}

第二次返回打印n

 private Person extractUserFromResultSet(ResultSet rs) throws SQLException {

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

【问题讨论】:

  • 他们可以是equal() 并返回相同的hashCode() 吗?如果是这样,Set 将忽略重复项。
  • 我“猜测”hashCode/equals 的实现Person 为两行返回相同的值,因此HashSet 忽略了第二个结果。尝试改用List(即ArrayList
  • 嗯是有道理的。谢谢我试试看。
  • 现在它得到 2 但它返回最后一行两次。
  • 第一个问题你整理好了吗?如果有怎么办?因为您可能会将最后一行添加两次。因为我没有看到您的写入功能有任何问题。

标签: java set resultset


【解决方案1】:

我不确定你在 extract 方法中声明 person 的位置。

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

所以我认为发生的事情是你宣布了一个全球性的人。你正在设置字段。所以有一个人对象,你只是在改变它的细节。当您将其添加到数组列表时,您将引用添加到同一个人。所以最后你添加了 3 个对同一个 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;
}

【讨论】:

  • 别担心,很高兴你把它修好了。我希望你也学会了一些调试方法。
猜你喜欢
  • 2020-02-06
  • 1970-01-01
  • 2013-12-05
  • 1970-01-01
  • 1970-01-01
  • 2019-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多