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

Exception in thread "main" java.sql.SQLException: Column Index out of range, 5 > 4.

Bom dia!! Alguém poderia me ajudar com esse erro, não consigo identificar. Desde já agradeço.

import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;

import br.com.alura.jdbc.ConnectionFactory;
import br.com.alura.jdbc.dao.CategoriaDAO;
import br.com.alura.jdbc.modelo.Categoria;
import br.com.alura.jdbc.modelo.Produto;

public class TestaListagemDeCategorias {

    public static void main(String[] args) throws SQLException {
        try (Connection connection = new ConnectionFactory().recuperarConexao()) {

            CategoriaDAO categoriaDAO = new CategoriaDAO(connection);
            List<Categoria> listaDeCategorias = categoriaDAO.listarComProdutos();
            listaDeCategorias.stream().forEach(ct -> {
                System.out.println(ct.getNome());

                for (Produto produto : ct.getProdutos()) {
                    System.out.println(ct.getNome() + " - " + produto.getNome());
                }
            });

        }
    }

}
package br.com.alura.jdbc.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.jdbc.modelo.Categoria;
import br.com.alura.jdbc.modelo.Produto;

public class CategoriaDAO {

    private Connection connection;

    public CategoriaDAO(Connection connection) {

        this.connection = connection;

    }

    public List<Categoria> listar() 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<>();

        System.out.println("Executando a query de listar categoria");

        String sql = "SELECT C.ID, C.NOME, P.ID, P.DESCRICAO FROM CATEGORIA C INNER JOIN PRODUTO P ON 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;
    }

}
3 respostas

O erro

nov. 10, 2021 9:55:42 AM com.mchange.v2.log.MLog 
INFO: MLog clients using java 1.4+ standard logging.
nov. 10, 2021 9:55:42 AM com.mchange.v2.c3p0.C3P0Registry 
INFO: Initializing c3p0-0.9.5.4 [built 23-March-2019 23:00:48 -0700; debug? true; trace: 10]
nov. 10, 2021 9:55:42 AM com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource 
INFO: Initializing c3p0 pool... com.mchange.v2.c3p0.ComboPooledDataSource [ acquireIncrement -> 3, acquireRetryAttempts -> 30, acquireRetryDelay -> 1000, autoCommitOnClose -> false, automaticTestTable -> null, breakAfterAcquireFailure -> false, checkoutTimeout -> 0, connectionCustomizerClassName -> null, connectionTesterClassName -> com.mchange.v2.c3p0.impl.DefaultConnectionTester, contextClassLoaderSource -> caller, dataSourceName -> 1hgeby9al2r2l1e8ylpv3|3c5a99da, debugUnreturnedConnectionStackTraces -> false, description -> null, driverClass -> null, extensions -> {}, factoryClassLocation -> null, forceIgnoreUnresolvedTransactions -> false, forceSynchronousCheckins -> false, forceUseNamedDriverClass -> false, identityToken -> 1hgeby9al2r2l1e8ylpv3|3c5a99da, idleConnectionTestPeriod -> 0, initialPoolSize -> 3, jdbcUrl -> jdbc:mysql://localhost/loja_virtual?useTimezone=true&serverTimezone=UTC, maxAdministrativeTaskTime -> 0, maxConnectionAge -> 0, maxIdleTime -> 0, maxIdleTimeExcessConnections -> 0, maxPoolSize -> 15, maxStatements -> 0, maxStatementsPerConnection -> 0, minPoolSize -> 3, numHelperThreads -> 3, preferredTestQuery -> null, privilegeSpawnedThreads -> false, properties -> {password=******, user=******}, propertyCycle -> 0, statementCacheNumDeferredCloseThreads -> 0, testConnectionOnCheckin -> false, testConnectionOnCheckout -> false, unreturnedConnectionTimeout -> 0, userOverrides -> {}, usesTraditionalReflectiveProxies -> false ]
Executando a query de listar categoria
Exception in thread "main" java.sql.SQLException: Column Index out of range, 5 > 4. 
    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.checkColumnBounds(ResultSetImpl.java:461)
    at com.mysql.cj.jdbc.result.ResultSetImpl.getString(ResultSetImpl.java:835)
    at com.mchange.v2.c3p0.impl.NewProxyResultSet.getString(NewProxyResultSet.java:4189)
    at br.com.alura.jdbc.dao.CategoriaDAO.listarComProdutos(CategoriaDAO.java:67)
    at TestaListagemDeCategorias.main(TestaListagemDeCategorias.java:16)
solução!

Ederson, boa noite. Esse erro está falando que não há nenhuma informação para a quinta string rst.getString(5)

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

Perceba que na query SELECT C.ID, C.NOME, P.ID, P.DESCRICAO você só está solicitando o id da categoria (C.ID), o nome da categoria (C.NOME), o id do produto (P.ID) e a descrição do produto (P.DESCRICAO). Dessa forma, você só tem 4 índices rst.getInt(1), rst.getString(2), rst.getInt(3), rst.getString(4). Se você quiser os 5 índices, vai precisar alterar a query para buscar o nome do produto também SELECT C.ID, C.NOME, P.ID, P.NOME, P.DESCRICAO

Ficou claro? =)

Funcionou!!! Muito obrigado pela ajuda.