Table only fills the column title

Asked

Viewed 57 times

0

I wrote the method below:

public void setListaCompra() {
        String sql = "SELECT * FROM\n" +
                     "(\n" +
                     "    SELECT \n" +
                     "    produtos.id AS id, \n" +
                     "    nome_produto AS Nome, \n" +
                     "    SUM(estoque.Estoque_produto) AS Estoque, \n" +
                     "    Periodicidade AS Periodicidade, \n" +
                     "    produtos.estoquemax_produto AS 'Média de venda mensal',\n" +
                     "    IF(SUM(estoque.Estoque_produto) > produtos.estoquemax_produto * 2, 'Muito alto', IF(SUM(estoque.Estoque_produto) > produtos.estoquemax_produto , 'Alto', IF(SUM(estoque.Estoque_produto) > (produtos.estoquemax_produto / IF(Periodicidade = 'M' , 1 , IF(Periodicidade = 'Q' , 2 , 4))) *0.5, 'Bom', IF(SUM(estoque.Estoque_produto) > (produtos.estoquemax_produto / IF(Periodicidade = 'M' , 1 , IF(Periodicidade = 'Q' , 2 , 4))) * 0.3, 'Baixo', IF(SUM(estoque.Estoque_produto) >  0, 'Crítico', 'Zerado'))))) AS 'Nível estoque', \n" +
                     "    precos.Custo_produto AS Custo, \n" +
                     "    produtos.fornecedor_principal AS Fornecedor,\n" +
                     "    Descricao_produto AS 'Marca/Laboratório', \n" +
                     "    grupos_prod.Nome_grupo AS Grupo, \n" +
                     "    subgrupos.Nome AS Subgrupo\n" +
                     "\n" +
                     "    FROM genius.produtos\n" +
                     "    JOIN produtos_estoque AS estoque ON produtos.id = estoque.id_produto\n" +
                     "    JOIN produtos_precos AS precos ON produtos.id = precos.id_produto\n" +
                     "    JOIN subgruposprodutos AS subgrupos ON produtos.Id_grupo = subgrupos.Id\n" +
                     "    JOIN grupos_produtos AS grupos_prod ON subgrupos.id_grupo = grupos_prod.Id\n" +
                     "    GROUP BY Id\n" +
                     ") AS d\n" +
                     "WHERE ?";
        String resultado;
        String pesquisa;
        String estado;
        String campo = null;

        pesquisa = txtPesquisaCompra.getText();
        if (cmbEstado.getSelectedItem().equals("Todos")) {
            estado = "";
        } else {
            estado = cmbEstado.getSelectedItem().toString();
        }
        if (radFornecedor.isSelected()) {
            campo = "d.Fornecedor";
        } else if (radGrupo.isSelected()){
            campo = "d.Grupo";
        } else if (radMarca.isSelected()){
            campo = "d.`Marca/Laboratório`";
        } else if (radNome.isSelected()){
            campo = "d.Nome";
        }

        resultado = campo + " LIKE '%" + pesquisa +"%' AND d.`Nível estoque` LIKE '%" + estado + "%'";
        System.out.println(resultado);
        try {
            pst = conexao.prepareStatement(sql);
            pst.setString(1, resultado);
            rs = pst.executeQuery();
            tblCompra.setModel(DbUtils.resultSetToTableModel(rs));
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, e);
        }
    }

When I run the method it fills only the column title and no row appears, initially I thought the problem was the value of the result string, because it is used to fill the value of the clause WHERE:

 pst.setString(1, resultado);

so I took String’s value using:

System.out.println(resultado);

that gave:

d.Nome LIKE '%%' AND d.`Nível estoque` LIKE '%%'

and I did it directly in Mysql, and it worked perfectly returning all the values, so the problem should be in the table, but I do not know where.

2 answers

1

you can still mount the query, for example: in Where you do:

"WHERE 1 = 1 ";

and in the conditions, you do so:

if (radFornecedor.isSelected()) {
    sql += "AND d.Fornecedor LIKE ?";
} else
...
}

and in the parameter:

pst.setString(1, "%" + pesquisa + "%");

Other, if you’re worried about performance, don’t concatenate Strings, instead use a Stringbuilder.

1


When you use preparedStatements, the parameters should contain only values, there should not be an sql expression in them, as you are doing. You should change your algorithm to instead of something like this:

"WHERE ?";

You have something like that:

"WHERE d.Nome LIKE ? AND d.`Nível estoque` LIKE ?";

And then yes, you inform the parameters.

  • I found out on my own, but that was it, thank you very much. Is there no way to use expressions in the parameters or something equivalent? because the code became very small, but as it did not give the code ended up getting huge and slow, and it would be a hand in the wheel for several situations

  • See my other answer below.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.