O que está errado neste comando MySQL?

Cordiais saudações, povo do GUJ.

Por favor, examinem o comando sql que está no método abaixo, pois está dando erro de sintaxe no MySQL:

    public ArrayList<ItensPedidoClienteEstendida> carregarListaItens() {
        ArrayList<ItensPedidoClienteEstendida> listaItens = new ArrayList<>();
        ItensPedidoClienteEstendida itemPedido;
        listaItens = null;
        bd = BD.getInstance();
        sql = "SELECT i.id,"
                + " i.id_pedido_cli,"
                + " i.id_produto,"
                + " i.quantidade,"
                + " i.preco,"
                + " i.data_entrega,"
                + " p.descricao FROM item_pedido_cli AS i LEFT JOIN produtos AS p"
                + " WHERE id = ? AND i.id_produto = p.id;";
        try {
            statement = bd.connection.prepareStatement(sql);
            statement.setString(1, String.valueOf(pedidoCliente.getId()));
            resultSet = statement.executeQuery();
            int numeroItem = 0;
            while(resultSet.next()) {
                numeroItem++;
                itemPedido = new ItensPedidoClienteEstendida();
                itemPedido.setId(resultSet.getInt(1));
                itemPedido.setId_pedido_cli(resultSet.getInt(2));
                itemPedido.setId_produto(resultSet.getString(3));
                itemPedido.setQuantidade(resultSet.getDouble(4));
                itemPedido.setPreco(resultSet.getDouble(5));
                itemPedido.setData_entrega(resultSet.getDate(6));
                itemPedido.setNumero_item(numeroItem);
                itemPedido.setDescricao_produto(resultSet.getString(7));
                listaItens.add(itemPedido);
            }
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "Problemas na localização dos itens!\n" + e);
        } finally {
            BD.getInstance().close();
        }
        return listaItens;
    }

É um comando um pouquinho mais complicado pois acessa duas tabelas para reter a descrição de produto junto com os dados do item de pedido correspondente. Como sou inexperiente com Java e MySQL pode ser um erro fácil mas para mim esta complicado dizer o que é.

Obrigado,
Ronaldo

Qual mensagem de erro está sendo reportada? Por aí já dá pra ter uma ideia.

De toda forma, se você vai fazer a junção com join, acho que falta os parâmetros de junção (“on …”) entre as tabelas no seu join. Algo como:

" p.descricao FROM item_pedido_cli AS i LEFT JOIN produtos AS p ON i.id_produto = p.id"

Agora, se for usar o where para fazer a junção, não precisa do join:

+ " p.descricao FROM item_pedido_cli AS i, produtos AS p"
+ " WHERE id = ? AND i.id_produto = p.id;";

Veja se é isso.

Abraço.

1 curtida

O join está incompleto. O certo é:

FROM 
  item_pedido_cli i
  LEFT JOIN produtos p ON i.id_produto = p.id

Ao usar o ON no LEFT JOIN, vc não precisar mais incluir i.id_produto = p.id no WHERE.

SELECT 
  i.id,
  i.id_pedido_cli,
  i.id_produto,
  i.quantidade,
  i.preco,
  i.data_entrega,
  p.descricao
FROM 
  item_pedido_cli i
  LEFT JOIN produtos p ON p.id = i.id_produto
WHERE
  id = ?
1 curtida

Esta legal, Lucas. Agora deu outro erro. Vou digitar o que o programa disse:

java.sql.SQLIntegrityConstraintViolationException: Column ‘id’ in where clause is ambiguous

Algum tipo de violação de integridade na coluna id.
O que deve ser isto?

Mais de uma tabela usada na consulta possui a coluna com o nome id. Com isso, não dá para saber de qual tabela é a coluna id usada no WHERE. Para corrigir isso, vc deve usar o alias da tabela em questão.

Eu estou usando o alias correto! Não sei o que está errado. Veja o código, não está correto?

    public ArrayList<ItensPedidoClienteEstendida> carregarListaItens() {
        ArrayList<ItensPedidoClienteEstendida> listaItens = new ArrayList<>();
        ItensPedidoClienteEstendida itemPedido;
        listaItens = null;
        bd = BD.getInstance();
        sql = "SELECT i.id,"
                + " i.id_pedido_cli,"
                + " i.id_produto,"
                + " i.quantidade,"
                + " i.preco,"
                + " i.data_entrega,"
                + " p.descricao FROM item_pedido_cli AS i LEFT JOIN produtos AS p"
                + " ON  i.id_produto = p.id"
                + " WHERE id = ?;";
        try {
            statement = bd.connection.prepareStatement(sql);
            statement.setString(1, String.valueOf(pedidoCliente.getId()));
            resultSet = statement.executeQuery();
            int numeroItem = 0;
            while(resultSet.next()) {
                numeroItem++;
                itemPedido = new ItensPedidoClienteEstendida();
                itemPedido.setId(resultSet.getInt(1));
                itemPedido.setId_pedido_cli(resultSet.getInt(2));
                itemPedido.setId_produto(resultSet.getString(3));
                itemPedido.setQuantidade(resultSet.getDouble(4));
                itemPedido.setPreco(resultSet.getDouble(5));
                itemPedido.setData_entrega(resultSet.getDate(6));
                itemPedido.setNumero_item(numeroItem);
                itemPedido.setDescricao_produto(resultSet.getString(7));
                listaItens.add(itemPedido);
            }
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "Problemas na localização dos itens!\n" + e);
        } finally {
            BD.getInstance().close();
        }
        return listaItens;
    }

Aqui não está usando o alias.

4 curtidas