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

Não seria mais prático o usar "GROUP BY"?

Olá comunidade Alura, como estão?

Espero que bem!

Assistindo a aula, vi a implementação, criando uma variavel ultima, só para não repetir o tipo de categoria, mas tem uma clausula SQL chamada DISTINCT pra trazer os que são diferentes apenas, e temos também o GROUP BY que agrupa a coluna pelos semelhantes.

O meu código de listarComProdutos() na CategoriaDAO ficou assim:

public List<Categoria> listarComProdutos() throws SQLException {

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

        System.out.println("Executando listar categoria");

        String sql = "SELECT C.ID, C.NOME, P.ID, P.NOME, P.DESCRICAO  FROM CATEGORIA C INNER JOIN PRODUTO P ON C.ID = P.CATEGORIA_ID GROUP BY P.CATEGORIA_ID";

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

.

E a minha saida foi o nome das categorias uma únicas vez ao executar o TestaListagemDeCategorias.

Vai ter alguma diferença eu manter meu código desta forma? Houve uma razão em especial para não usar as clausulas SQL?

2 respostas

É.. não deu certo tentar fazer diferente do professor, ao prossegui a aula deu erro. Ao final meu código ficou desta forma:

    public List<Categoria> listarComProdutos() throws SQLException {

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

        System.out.println("Executando listar categoria");

        String sql = "SELECT C.ID, C.NOME, P.ID, P.NOME, P.DESCRICAO  FROM CATEGORIA C INNER JOIN PRODUTO P ON C.ID = P.CATEGORIA_ID GROUP BY P.CATEGORIA_ID";

        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));
                    ultima = categoria;
                    categorias.add(categoria);
                }
                Produto produto = new Produto(rst.getInt(3), rst.getString(4), rst.getString(5));
                ultima.adicionar(produto);
            }
        }
        return categorias;
    }

E ao executar o TestaListagemDeCategorias apresenta o erro: Exception in thread "main" java.sql.SQLException: After end of result set Aparentemente tem alguam coisa a ver com a linha:

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

Alguém poderia me ajudar a entender melhor por que não deu certo?

solução!

Já consegui resolver, um dos problemas é que o meu

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

Estava fora do while, e o outro é que ao fazer o agrupamento, eu ia trazer como resultado apenas um item de cada categoria, e não era bem isso que eu queria.

Enfim, resolvido!