Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Exceção ao Listar Com os Produtos

Boa tarde,

Ao executar o programa para listar as categorias + os produtos, está ocorrendo a seguinte exceção:

Exception in thread "main" java.sql.SQLException: After end of result set
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129)
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97)
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:89)
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:63)
    at com.mysql.cj.jdbc.result.ResultSetImpl.checkRowPos(ResultSetImpl.java:484)
    at com.mysql.cj.jdbc.result.ResultSetImpl.getObject(ResultSetImpl.java:1283)
    at com.mysql.cj.jdbc.result.ResultSetImpl.getInt(ResultSetImpl.java:786)
    at com.mchange.v2.c3p0.impl.NewProxyResultSet.getInt(NewProxyResultSet.java:425)
    at br.com.alura.DAO.CategoriaDAO.listarComProdutos(CategoriaDAO.java:61)
    at TesteListaDeCategorias.main(TesteListaDeCategorias.java:16)

Seguem as classes utilizadas:

package br.com.alura.modelo;

import java.util.ArrayList;
import java.util.List;

public class Categoria {

    private Integer id;
    private String nome;
    private List<Produto> produtos = new ArrayList<>();

    public Categoria(Integer id, String nome) {
        this.id = id;
        this.nome = nome;
    }

    public String getNome() {
        return nome;
    }

    public Integer getId() {
        return id;
    }

    public List<Produto> getProdutos() {
        return produtos;
    }

    public void adicionar(Produto produto) {
        produtos.add(produto);
    }
}
package br.com.alura.DAO;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import br.com.alura.modelo.Categoria;
import br.com.alura.modelo.Produto;

public class CategoriaDAO {

    private Connection connection;

    public CategoriaDAO(Connection connection) {
        this.connection = connection;
    }

    public List<Categoria> listarCategoria() throws SQLException {
        List<Categoria> categorias = new ArrayList<>();

        String sql = "SELECT ID, NOME FROM CATEGORIA";

        try (PreparedStatement pstm = connection.prepareStatement(sql)) {
            pstm.execute();

            try (ResultSet rst = pstm.getResultSet()) {
                while (rst.next()) {

                    Categoria categoria = new Categoria(rst.getInt(1), rst.getString(2));

                    categorias.add(categoria);
                }
            }
        }
        return categorias;
    }

    public List<Categoria> listarComProdutos() throws SQLException {

        Categoria ultima = null;
        List<Categoria> categorias = new ArrayList<>();

        String sql = "SELECT C.ID, C.NOME, P.ID, P.NOME, P.DESCRICAO FROM CATEGORIA C INNER JOIN"
                + " PRODUTO P WHERE C.ID = P.CATEGORIA_ID";

        try (PreparedStatement pstm = connection.prepareStatement(sql)) {
            pstm.execute();

            try (ResultSet rst = pstm.getResultSet()) {
                while (rst.next()) {
                    if (ultima == null || !ultima.getNome().equals(rst.getString(2))) {
                        Categoria categoria = new Categoria(rst.getInt(1), rst.getString(2));
                        ultima = categoria;
                        categorias.add(categoria);

                    }
                }
                Produto produto = new Produto(rst.getInt(3), rst.getString(4), rst.getString(5));
                ultima.adicionar(produto);
            }
        }
        return categorias;
    }
}
import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;

import br.com.alura.DAO.CategoriaDAO;
import br.com.alura.modelo.Categoria;
import br.com.alura.modelo.Produto;

public class TesteListaDeCategorias {

    public static void main(String[] args) throws SQLException {

        try (Connection connection = new ConnectionFactory().connectionFactory()) {

            CategoriaDAO categoriaDAO = new CategoriaDAO(connection);
            List<Categoria> listaDeCategorias = categoriaDAO.listarComProdutos();
            listaDeCategorias.stream().forEach(ct -> {
                for(Produto produto : ct.getProdutos()) {
                    System.out.println(ct.getNome() + " - " + produto.getNome());
                }
            });
        }

    }
}

Poderia me indicar onde esta o erro na Classe CategoriaDAO?

Obrigado!

2 respostas
solução!

Olá Murillo, tudo bem com você?

A exceção diz que você está tentando acessar uma área fora do alcance do result set. No caso, basta você ir até o método listarComProdutos() e colocar essas duas linhas dentro do while():

Produto produto = new Produto(rst.getInt(3), rst.getString(4), rst.getString(5));
ultima.adicionar(produto);

Veja que como essas linhas estão dentro do while, o comando que acessa os elementos do ResultSet para de criar um novo produto voltou a ter acesso à eles por estarem no mesmo escopo do while.

while (rst.next()) {
    if (ultima == null || !ultima.getNome().equals(rst.getString(2))) {
        Categoria categoria = new Categoria(rst.getInt(1), rst.getString(2));
        ultima = categoria;
        categorias.add(categoria);
    }
    Produto produto = new Produto(rst.getInt(3), rst.getString(4), rst.getString(5));
    ultima.adicionar(produto);
}

Se ficou alguma dúvida é só avisar!

Abraços e bons estudos!!

Boa tarde Thiago, tudo certo?

Consegui entender qual foi o erro aqui!

Muito Obrigado pela ajuda!