Dúvida consulta MYSQL com Java

Olá, sou principiante e estou com uma dúvida sobre uma consulta com um formulário que possui 3 campos sendo o primeiro pelo nome, o qual está funcionando com o comando LIKE, porém quando digito apenas um dos outros dois critérios, obtenho o retorno de todos os dados do BD e não apenas os relativos ao critério escolhido, no caso CPF ou PRODUTO.

Desculpe, segue o código:

private void ConsultarActionPerformed(java.awt.event.ActionEvent evt) {
try {
Class.forName(“com.mysql.jdbc.Driver”);

        Connection conn;
       
        conn = DriverManager.getConnection("jdbc:mysql://localhost/trocarefil","root","");
        
        String query = "SELECT * from Clientes WHERE  Nome LIKE ?  or CPF = ? or Produto = ?";
        
        
        PreparedStatement stmt;
        
        stmt = conn.prepareStatement(query);
        //Pega o texto digitado no campo de pesquisa Nome ou CPF ou Produto
        stmt.setString(1,nome.getText()+'%');
        stmt.setString(2,jTextField2.getText());
        stmt.setString(3,jTextField3.getText());
        
        
        ResultSet rs;
        rs = stmt.executeQuery();
        DefaultTableModel model;
        model = (DefaultTableModel)jTable1.getModel();
        model.setNumRows(1);
        
         
        
        while (rs.next()){
            model.addRow(
            new Object[]{ 
                
                rs.getString("Nome"),
                rs.getString("Endereço"),
                rs.getString("CPF"),
                rs.getString("ClienteDesde"),
                rs.getString("Produto"),
                rs.getString("EmailCliente"),
                rs.getString("TelefoneCliente"),
                rs.getString("IdClientes"),
               
                
                    }
        );

Boa tarde Claudio,

o erro está no SQL, veja que quando usa OR você está dizendo que qualquer uma das três opções servem, quando na verdade você só quer a que estiver com Jtextfield preenchido para buscar. Note que ao fazer a busca por cpf ele vai te retornar o registro, MAS também vai trazer tudo que tiver LIKE ‘%’ (ou seja tudo que tem no banco) já que seu campo nome estará vazio. Uma sugestão fácil e simples é realizar uma consulta separada para cada campo.

Obrigado Filipe, vou fazer como vc indicou!

Olá Filipe, tentei mas não consegui separar as consultas, poderia me ajudar ?

private void ConsultarActionPerformed(java.awt.event.ActionEvent evt) {
try {
Class.forName(“com.mysql.jdbc.Driver”);

        Connection conn;

        conn = DriverManager.getConnection("jdbc:mysql://localhost/trocarefil", "root", "CL4UDI0P3DR4");

        String query = "SELECT * from Clientes WHERE  Nome LIKE ?";
                   
       
        

        PreparedStatement stmt;

        stmt = conn.prepareStatement(query);
        //Pega o texto digitado no campo de pesquisa Nome ou CPF ou Produto
        stmt.setString(1, nome.getText() + '%');
        //stmt.setString(2, jTextField2.getText());
        //stmt.setString(3, jTextField3.getText());

        ResultSet rs;
        rs = stmt.executeQuery();
        DefaultTableModel model;
        model = (DefaultTableModel) jTable1.getModel();
        model.setNumRows(1);

        while (rs.next()) {
            model.addRow(
                    new Object[]{
                        rs.getString("Nome"),
                        rs.getString("Endereço"),
                        rs.getString("CPF"),
                        rs.getString("ClienteDesde"),
                        rs.getString("Produto"),
                        rs.getString("EmailCliente"),
                        rs.getString("TelefoneCliente"),
                        rs.getString("IdClientes"),}
            );

        }

    } catch (SQLException ex) {
        System.out.println("Ocorreu um erro de SQL !" + ex.getMessage());

    } catch (ClassNotFoundException ex) {
        System.out.println("Classe não encontrada!" + ex.getMessage());
    }


}

Antes de mais, qual é o resultado pretendido se eu preencher dois campos? Obter os registos que obedeçam obrigatoriamente a ambos os campos (construir query com AND) ou os registo que obedeçam a qualquer um dos campos (construir query com OR).
Depois, em qualuqer dois casos, só deves adicionar os campos à query se estiverem preenchidos.

Desculpe, como já falei sou principiante, poderia me orientar como fazer isso ?

Não posso ajudar se não souber o que queres :slight_smile:

Cláudio,
como o pmlm falou vc precisa primeiro saber como sua aplicação vai se comportar, por exemplo e se o usuário preencher 2 campos e clicar no botão de consulta, o que deve acontecer? A sugestão que eu te dei de separar as consultas também envolve criar condições. Já tive uma situação parecida com a sua, eu tinha 3 critérios de pesquisa ai fiz somente um campo para todas elas, no caso usei radioButton para o usuário selecionar o critério de pesquisa (por nome, por cpf, etc) ai de acordo com o critério selecionado eu passava o valor do Jtextfield para a consulta SQL específica.

Ok, obrigado pela sugestão.
Implementei o exemplo dos radioButtons.