Table only fills the column title

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, I initially thought the problem was in the value of the String result, since it is used to fill in the value of the WHERE clause:

 pst.setString(1, resultado);

Then I got the value of String using:

System.out.println(resultado);

You gave:

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

I did it right in MySql, and it worked fine by returning all the values, so the problem should be in the table, but I do not know where.

    
asked by anonymous 26.09.2016 / 21:08

2 answers

1

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

"WHERE ?";

You get something like this:

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

And then yes, you inform the parameters.

    
26.09.2016 / 23:32
1

You can still mount the query, for example: No where are you doing:

"WHERE 1 = 1 ";

And under the conditions, you do this:

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

and in the parameter:

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

Other, if you're concerned with performance, do not concatenate Strings, instead, use a StringBuilder.

    
27.09.2016 / 19:43