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

SQLSyntaxErrorException na listagem por categorias

Tive um erro nesta aula ao tentar listar os produtos por categoria. Vi que um outro aluno teve um erro semelhante, mas no tópico já fechado não vi uma solução. Segue o erro:

Exception in thread "main" java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'FROM CATEGORIA' at line 1
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120)
    at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)
    at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:916)
    at com.mysql.cj.jdbc.ClientPreparedStatement.execute(ClientPreparedStatement.java:354)
    at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.execute(NewProxyPreparedStatement.java:67)
    at br.com.alura.jdbc.dao.CategoriaDAO.listar(CategoriaDAO.java:26)
    at br.com.alura.jdbc.modelo.TestaListagemCategorias.main(TestaListagemCategorias.java:18)

Segue o código do método de listagem feito seguindo o professor:

package br.com.alura.jdbc.dao;

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

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

public class ProdutoDAO {

    private Connection connection;

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

    public void salvar(Produto produto) throws SQLException {

            String sql = "insert into produtos (nome, descricao) values (?, ?)";

            try(PreparedStatement pstm = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)) {

                pstm.setString(1, produto.getNome());
                pstm.setString(2, produto.getDescricao());

                pstm.execute();

                try(ResultSet rst = pstm.getGeneratedKeys()) {
                    while(rst.next()) {
                        produto.setId(rst.getInt(1));
                    }
                }
            }
    }

    public List<Produto> listar() throws SQLException {
        List<Produto> produtos = new ArrayList<>();

        String sql = "select id, nome, descricao from produtos";

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

            try(ResultSet rst = pstm.getResultSet()) {
                while(rst.next()) {
                    Produto produto = new Produto(rst.getInt(1), rst.getString(2), rst.getString(3));

                    produtos.add(produto);
                }
            }
        }
        return produtos;
    }

    public List<Produto> listarPorCategoria(Categoria ct) throws SQLException {

        List<Produto> produtos = new ArrayList<>();

        String sql = "select id, nome, descricao from produtos where categoria_id = ?";

        try(PreparedStatement pstm = connection.prepareStatement(sql)) {
            pstm.setInt(1, ct.getId());
            pstm.execute();

            try(ResultSet rst = pstm.getResultSet()) {
                while(rst.next()) {
                    Produto produto = new Produto(rst.getInt(1), rst.getString(2), rst.getString(3));

                    produtos.add(produto);
                }
            }
        }
        return produtos;
    }
}

As classes estão compilando normalmente, mas apenas nessa listagem ocorre esse erro. Além disso, consigo realizar a consulta normalmente pelo MySQL. Já estou tentando encontrar a falha há um tempo, mas infelizmente não consegui achar.

3 respostas
solução!

Pedro, bom dia. Na exceção, o erro aparece para a classe CategoriaDAO e vc colocou a classe de ProdutoDAO. Vc pode nos fornecer o código de CategoriaDAO?

Olá João, bom dia!

O erro era lá mesmo e eu por não ter entendido a mensagem de erro estava procurando no DAO errado. Havia uma vírgula a mais na query, antes do FROM CATEGORIA, e por isso a busca não estava funcionando, mas sem ela deu tudo certo.

Muito obrigado pela ajuda!

Valeu, Pedro!! =)

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software