Francisunoxx
Francisunoxx

Reputation: 1458

Getting ResultSet from loop while adding it to List

I have a List getter method that returns a ResultSet. Everytime the ResultSet loops this was added to List. But in my ActionListener I have a loop that changes the values everytime and also it gives another ResultSet. How can I avoid List to create another instance when calling the getter method?

public List <Model> get(Model model) 
{
    String query = "{call get(?,?,?,?)}";
    List <Model> list = new ArrayList();

    try(Connection con = DBUtil.getConnection(DBType.MYSQL);
        CallableStatement cs = con.prepareCall(query);)
    {
        cs.setInt(1, model.getName());
        cs.setString(2, model.getPosition());
        cs.setString(3, model.getDepartment());
        cs.setString(4, model.getDate());

        try(ResultSet rs = cs.executeQuery())
        {
            while(rs.next())
            {
                Model m = new Model();

                m.setIn(rs.getString(1));
                m.setOut(rs.getString(2));

                list.add(m);

            }
        }
    }
    catch(SQLException ex)
    {
        System.err.println("Error "+ex.getSQLState());
    }
    return list;
}

Calling this in action listener.

for(int i = 0; i < myList.size(); i++)
{
    model.setName("Anything");
    model.setPosition("Jr");
    model.setDepartment("It");
    model.setDate(myList.get(i));

    DAO.get(model);
}

As you can see here loop gives new value everytime it loops. My problem is getter method resets to zero after executing one row at resultset loop.

Upvotes: 2

Views: 362

Answers (1)

Malt
Malt

Reputation: 30285

If you want to gather the elements from all get() invocations, there are two solutions.

Either collect the returned elements into a single list in the calling loop:

ArrayList<Model> list = new ArrayList<>(); 
for(int i = 0; i < myList.size(); i++)
{
    model.setName("Anything");
    model.setPosition("Jr");
    model.setDepartment("It");
    model.setDate(myList.get(i));

    list.addAll(DAO.get(model)); //Get elements, and add them to the list
}

... Or change public List <Model> get(Model model) to public List<Model> get(Model model, List<Model> list) and instead of creating a new list for each invocation of get(), pass it the same list:

public List<Model> get(Model model, List<Model> list) 
{
    String query = "{call get(?,?,?,?)}";

    try(Connection con = DBUtil.getConnection(DBType.MYSQL);
        CallableStatement cs = con.prepareCall(query);)
    {
        cs.setInt(1, model.getName());
        cs.setString(2, model.getPosition());
        cs.setString(3, model.getDepartment());
        cs.setString(4, model.getDate());

        try(ResultSet rs = cs.executeQuery())
        {
            while(rs.next())
            {
                Model m = new Model();

                m.setIn(rs.getString(1));
                m.setOut(rs.getString(2));

                list.add(m);

            }
        }
    }
    catch(SQLException ex)
    {
        System.err.println("Error "+ex.getSQLState());
    }
    return list;
}

Then invoke get() like this:

ArrayList<Model> list = new ArrayList<>(); 
for(int i = 0; i < myList.size(); i++)
{
    model.setName("Anything");
    model.setPosition("Jr");
    model.setDepartment("It");
    model.setDate(myList.get(i));

    DAO.get(model,list);
}

Upvotes: 1

Related Questions