Foreach returning only one object in the list

Asked

Viewed 212 times

0

I have a JSP page and in it I want a list. For this, I created a method listarTodos() within the DAO class and set the fields to display the object data, thus leaving the code:

</div>

        <%  
            ProdutoDAO produtoDAO = new ProdutoDAO();
            List<Produto> produtos = produtoDAO.listarTodos();
        %>
            <table class="table table-striped table-inverse">
                <thead>
                    <tr>
                        <th>Código</th>
                        <th>Produto</th>
                        <th>Tipo de Produto</th>
                        <th>Quantidade</th>
                        <th>Preço em R$</th>
                        <th>Tipo de Negociação</th>

                    </tr>
                </thead>
                <tbody>
                    <%for(Produto produto : produtos){ %>
                    <tr>                        
                        <td><%=produto.getIdProduto()%></td>
                        <td><%=produto.getNomeProduto()%></td>
                        <td><%=produto.getTipoProduto()%></td>
                        <td><%=produto.getQtdProduto()%></td>
                        <td><%=produto.getPreco()%></td>
                        <td><%=produto.getTipoNegociacao()%></td>
                        <td>Editar</td>
                        <td><a href="prodcontroller.do?acao=excluir&input_codigo=<%=produto.getIdProduto()%>">Excluir</a></td>
                    </tr>

                    <%} %>
                </tbody>
            </table>
        </div>

The problem is that it is listing the number of right records, but it is populating all "product" objects with only one row of the database. So if I have there N records, these N records would popular the object with the same data.

Example: id: 123; product:banana: type:fruit; qnt:6 ; price=1.0 ; negotiation type: sale. <~~~~ that In the 14 created objects.

Follow the method code:

public List<Produto> listarTodos() {
        ConexaoBD conexao = new ConexaoBD();
        conexao.conecta();
        List<Produto> produtos = new ArrayList<>();
        Produto produto = new Produto();

        try {
            Statement st = conexao.conn.createStatement();
            ResultSet rs = st.executeQuery(LISTAR_TUDO);
            while(rs.next()) {          
                produto.setIdProduto(rs.getInt("id_produto"));
                produto.setNomeProduto(rs.getString("ds_tipo_produto"));
                produto.setNomeProduto(rs.getString("nm_produto"));
                produto.setQtdProduto(rs.getInt("nr_quantidade"));
                produto.setPreco(rs.getDouble("vl_preco"));
                produto.setTipoNegociacao(rs.getString("ds_tipo_negociacao"));
                produtos.add(produto);

            }
            rs.close();


        } 
        catch(SQLException ex) {
            ex.printStackTrace();
        }
        return produtos;

    }

You can see where I’m going wrong?

  • How is the SQL in this variable LISTAR_TUDO ?

  • SELECT * FROM product

  • Apparently it was supposed to work ... do you have a constructor referring to the Product object? ... Why not try produtos.add(new Produto(rs.getInt("id_produto"),rs.getString("ds_tipo_produto")) );

  • That inside the While of the list all?

  • while(rs.next()) ' products.add( new Product(rs.getInt("id_product"), rs.getString("ds_tipo_product") ));

  • Boy, I think that was just my problem the Builder’s out of the While... tto caught since early on in this hahaha, I’m gonna test here and already I talk.

  • All right, try it there

  • hahahaha, was !!! that innocence mine I just put the builder inside the while. Thanks for the light ai Bruno!!!

  • Haha I am happy to have help, classify the answer as solved! Until next

Show 4 more comments

1 answer

0


Try changing the While from List All by creating a new Object instance at each result call

while(rs.next())          
   produtos.add( new Produto (rs.getInt("id_produto"),
                              rs.getString("ds_tipo_produto")) );

Browser other questions tagged

You are not signed in. Login or sign up in order to post.