Проблема при возврате значений из Java ResultSet - PullRequest
0 голосов
/ 14 октября 2018

По какой-то причине я возвращаю только 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Кажется, я получаю только последний.

enter image description here

enter image description here

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

Первая проблема решена с помощью этого кода

enter image description here

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

Первый возврат printn

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

Второй возврат printn

enter image description here

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

enter image description here

1 Ответ

0 голосов
/ 14 октября 2018

Я не уверен, где вы объявили человека, который находится в методе извлечения.

Но объявление одного локально в методе должно исправить проблему скрещенных пальцев.

Так что я думаю, что происходит, это выобъявлен глобальным человеком.И вы устанавливаете поля для этого.Таким образом, существует один объект человека, а вы просто меняете его детали.Когда вы добавляете его в arraylist, вы добавляете ссылку на того же человека.Итак, в конце вы добавили 3 ссылки на один и тот же объект person.В этом объекте person его поля установлены в последнюю запись в db.Надеюсь, это имеет смысл.

Причина, по которой я пришел к такому выводу, заключается в том, что я заставляю вас делать это в цикле rs.next, когда вы печатаете человека, который печатает ту же ссылку.Как только вы сделаете изменения ниже, вы увидите, что ссылки меняются.Потому что вы каждый раз создаете нового человека и возвращаете этот новый объект человека, а затем ссылка на него добавляется в массив.

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