Duvida pesquisar dados no Banco[RESOLVIDO]

Opa!

Seguinte, no controle tenho a seguinte query:

“SELECT FROM IMOVEIS CLIENTE_IMOVEIS WHERE LIKE ?” até ai blz!!!

Logo abaixo, tenho uma list e um metodo, nesse metodo eu acrescento um parametro String (óbvio) para a consulta apenas do cliente.
mais ou menos assim …

METODO( String nome);
smt.pstString (1, nome);

Blz…até ai tranquilo. Vou até meu View e consigo realizar a busca pelo Nome e reornar todos os meus dados.
A grande Duvida é:

Em uma View eu tenho vários campos, na verdade seria um filtro. o Cliente pode Filtrar a pesquisa, escolher por qual campo ele quer Buscar, ele pode selecionar quantos campos ele quizer.
Como ficaria meu metodo, minha List e principalmente la no meu view?

Lá eu faço algo como:

imoveis = jcbCliente_imoveis.getSelectedItem().toString();

mostrarImoveis(imoveis);

como eu faço para ele buscar End, tipo, etc…

Muito Obrigado.

Alguém sabe essa???

kra, essa query “SELECT FROM IMOVEIS CLIENTE_IMOVEIS WHERE LIKE ?” está incorreta, o correto seria

“SELECT FROM IMOVEIS CLIENTE_IMOVEIS WHERE NOME_DO_CAMPO LIKE ?”

pra buscar por outros campos, vc vai ter q criar sua query dinamicamente, vc pode atribuir esse NOME_DO_CAMPO a uma varivael, e setar nela o campo, de acordo com o que o cliente escolheu.

era isso?

Oi, efc.
Beleza?

Eu, normalmente, uso três métodos de pesquisa na minha camada de persistência:

  • recuperarPorID(long id);
  • recuperarTodos();
  • recuperarPorCriteria(Map<String, Object> criteria).

A resposta, para o seu caso, seria o terceiro método.
O método recuperarPorCriteria retorna uma coleção de objetos que você queira baseando em um ou mais critérios de pesquisa.
Se eu quero pesquisar por nome, eu coloco uma condição de pesquisa para nome. Se eu quero pesquisar por CPF, eu coloco uma condição para filtrar pelo CPF. E assim vale para todas as outras condições que você criar.

Um exemplo:

  1. Tenho uma classe Cliente:

[code]public class Cliente {

private Long ID;
private String nome;
private String CPF;

// getters e setters omitidos.

}
[/code]

  1. Na minha classe de persistência, o método recuperarPorCriteria ficaria assim:
public class PersistenciaCliente {

    public List<Cliente> recuperarPorCriteria(Map<String, Object> criteria) throws SQLException {

        // Primeiro, crio uma sentença base que me retorna TUDO o que eu quiser.
        String sentencaSelect = "SELECT * FROM DBO.CLIENTES WHERE 1 = 1";

       //Agora, eu crio as condições que eu quero. Aqui, criarei duas condições de pesquisa:
       //1. Por nome

        if (criteria.containsKey("nome")) {
            sentencaSelect =
                String.format("%s AND UPPER(NOME) LIKE '%%s%'", sentencaSelect, criteria.get("nome"));
        }

        //2. Por CPF
        if (criteria.containsKey("CPF")) {
            sentencaSelect = 
                String.format("%s AND UPPER(CPF) LIKE = '%s'", sentencaSelect, criteria.get("CPF"));
        }
        
        PreparedStatement statementSelect = connectionSelect.prepareStatement(sentencaSelect);
        ResultSet resultSelect = statementSelect.executeQuery();
  
        List<Cliente> clientes = new ArrayList<Cliente>();
        while (resultSelect.next()) {
            clientes.add(recuperarObjeto(resultSelect));
        }
        return clientes;
    }
    
    public Cliente recuperarObjeto(ResultSet resultSelect) throws SQLException {

        Cliente cliente = new Cliente();
        // preenche o seu objeto...
        return cliente;
    }
}
  1. Agora, crio uma classe de serviços que faz as pesquisas usando esse método:

[code]public class ServicosCliente {

public List<Cliente> recuperarClientesPorNome(String nomeCliente) throws SQLException {

    PersistenciaCliente persistenciaCliente = new PersistenciaCliente();
    Map<String, Object> criteria = new HashMap<String, Object>();

    criteria.add("nome", nomeCliente);
    return persistenciaCliente.recuperarPorCriteria(criteria);
}

public List<Cliente> recuperarClientesPorCPF(String cpfCliente) throws SQLException {

    PersistenciaCliente persistenciaCliente = new PersistenciaCliente();
    Map<String, Object> criteria = new HashMap<String, Object>();

    criteria.add("CPF", cpfCliente);
    return persistenciaCliente.recuperarPorCriteria(criteria);
}

}[/code]

Após isso, na minha classe View, eu faço as chamadas de cada método dependendo da pesquisa que o cliente quiser fazer!
Isso soluciona o seu problema?
Abraços!

Nicolas Fernandes…

Você é um gênio…acho q isso vá solucionar meu problema sim…Vou testar quando chegar em casa…
Na verdade vou criar um checkbox para cada campo que ele quizer buscar…

Kara muito obrigado por enquento, acho q isso vai solucionar sim…muito gênio…Parabéns. Ótima lógica.

Nicolas Fernandes…
Só uma Obs:

Como ficaria isso em um unico método… retornarClientes…? la na minha view?

Oi…

Eu uso o PreparedStatement , tem algum problema em usar o código acima?

[quote=efc]Nicolas Fernandes…
Só uma Obs:

Como ficaria isso em um unico método… retornarClientes…? la na minha view?[/quote]

Bom, eu faço da seguinte maneira:
Eu crio uma lista de RadioButton nas quais eu coloco as opções de pesquisa. No caso, criaria um JRadioButton para pesquisas por nome e um para pesquisas por CPF.

A partir daí, eu verificaria qual deles está selecionado e chamaria o determinado método da classe de serviços!
Por exemplo:

public class InterfacePesquisaClientes extends JFrame {

    private JRadioButton radiobuttonPesquisarNome, radiobuttonPesquisarCPF;
    private JTextField textfieldPesquisa;
    private JButton buttonPesquisa;

    private ClientesTableModel tablemodelClientes;

    public InterfacePesquisaClientes() {

        super();
        try {
        
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setResizable(false);

            carregarComponentesVisuais();
        }
        catch (Exception err) {
            err.printStackTrace();
        }
    }

    private void carregarComponentesVisuais() {

        ServicosCliente servicosCliente = new ServicosCliente();
       
        // preenche o TableModel com todos os clientes.
        tablemodelClientes.setClientes(servicosCliente.recuperarTodos());

        // Instancia os componentes
        radiobuttonPesquisarNome = new JRadioButton("Por nome");
        radiobuttonPesquisarCPF = new JRadioButton("Por CPF");
        textfieldPesquisa = new JTextField(20);
       
        // Cria e adiciona um evento para o botão de pesquisa.
        buttonPesquisa = new JButton("Pesquisar");
        buttonPesquisa.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent event) {

                try {
                    
                    ServicosCliente servicosCliente = new ServicosCliente();
                    List<Cliente> clientes = new ArrayList<Cliente>();

                    if (radiobuttonPesquisarNome.isChecked()) {
  
                        String nomeCliente = textfieldPesquisa.getText();
                        clientes = servicosCliente.recuperarPorNome(nomeCliente);
                    }
                    else if (radiobuttonPesquisarCPF.isChecked()) {
  
                        String cpfCliente = textfieldPesquisa.getText();
                        clientes = servicosCliente.recuperarPorCPF(cpfCliente);
                    }

                    tablemodelClientes.setClientes(clientes);
                }
                catch (SQLException errSQL) {
                    JOptionPane.showMessageDialog(null, "Erro no banco de dados! " + errSQL.getMessage());
                }
                catch (Exception err) {
                    JOptionPane.showMessageDialog(null, "Erro desconhecido! " + err.getMessage());
                }
            }
        }); 
    }
}

Que tal?

Eu uso o PreparedStatement , tem algum problema em usar o código acima?

obs: uso alguns combobox tmb…

Só fazer as alterações na persistência…

    public class PersistenciaCliente {  
      
        public List<Cliente> recuperarPorCriteria(Map<String, Object> criteria) throws SQLException {  
      
            // Primeiro, crio uma sentença base que me retorna TUDO o que eu quiser.  
            String sentencaSelect = "SELECT * FROM DBO.CLIENTES WHERE 1 = 1";  
            PreparedStatement statementSelect = connectionSelect.prepareStatement(sentencaSelect);
            int contadorPosicoes = 1;

           //Agora, eu crio as condições que eu quero. Aqui, criarei duas condições de pesquisa:  
           //1. Por nome  
      
            if (criteria.containsKey("nome")) {  
                
                sentencaSelect += "AND UPPER(NOME) LIKE ?";
                statementSelect.setString(contadorPosicoes, String.valueOf(criteria.get("nome"))); 
                contadorPosicoes++; 
            }  
      
            //2. Por CPF  
            if (criteria.containsKey("CPF")) {  

                sentencaSelect += "AND UPPER(CPF) LIKE = ?";
                statementSelect.setString(contadorPosicoes, String.valueOf(criteria.get("CPF"))); 
                contadorPosicoes++; 
            }  
             
            ResultSet resultSelect = statementSelect.executeQuery();  
            List<Cliente> clientes = new ArrayList<Cliente>();  
            while (resultSelect.next()) {  
                clientes.add(recuperarObjeto(resultSelect));  
            }  
            return clientes;  
        }  
          
        public Cliente recuperarObjeto(ResultSet resultSelect) throws SQLException {  
      
            Cliente cliente = new Cliente();  
            // preenche o seu objeto...  
            return cliente;  
        }  
    }  

Nicolas Fernandes, Muito Obrigado.

Farei os teste hj qndo chegar em casa.

Valeu mesmo …deu uma Aula…

Seguinte a Dica acima não resolveu. Estou usando a IDE netbeans e aparentemente não existe a API Criteria.
Então fiz uma Gambiarra feia q até funcionou, mas o código fica horrivel. Então gostaria da Dica de vocês para implementar esse código de uma maneira melhor.
Na verdade eu criei um metodo List com o retorno para cada String q quero buscar no Banco.
Exemplo: Preciso fazer uma busca no nome, O List Ficou assim (+ ou -):

List imoveis = new ArrayList(String nome);

smt.pstString (1, nome); // declaração da variavel citada acima : nome.

A grande duvida é q não posso colocar mais String na list, pois assim eu não conseguiria fazer a busca separada.

Então criei várias List. Com todas as Strings que preciso. FICOU HORRIVEL! o código controlador ficou enorme.

Agradeço a ajuda…

Que API Criteria, cara? Não tem nenhuma API Criteria usada ali… A única coisa chamada criteria são as variáveis Map do método O.o

Opa Nicolas, Tudo bem cara? Desculpa , mas pensei que fosse uma API. Boiei agora!!

Cara, quando crio o metodo la no bean, ele diz que não reconhece o : add

criteria.add(“nome”, nomeCliente);

e la no meu controlador ele diz que falta ) nesse metodo:

public List recuperarPorCriteria(Map<String, Object> criteria) throws SQLException {

Kara to dando algum vacilo feio…

O resto naum deu erro.
Foi mal achando q a criteria era Api, na verdade eu vi um artigo sobre isso e dizia isso la…

Então Nicolas…entendeu oq quiz dizer!!!

[quote=efc]Opa Nicolas, Tudo bem cara? Desculpa , mas pensei que fosse uma API. Boiei agora!!

Cara, quando crio o metodo la no bean, ele diz que não reconhece o : add

criteria.add(“nome”, nomeCliente);
[/quote]

Porque você tá criando o criteria no Bean?
criteria é o nome da variável que eu usei para representar um Mapa.
Olha na classe de serviço e veja a assinatura dela: Map<String, Object>.
É assim que é feito o uso dela, e o método add é para adicionar um item ao seu mapa.

Como você tá tentando fazer?

Vê o erro, detalha ele certinho aqui, vê em qual linha foi. Só assim a gente vai descobrir isso.

Nicolas, o criteria estou usando ele no visao.( Desculpa tinha falado bean)

ele não reconhece o add.

o erro la no controlador me pedindo para acrescentar ) (parenteses), aparece nessa linha:

public List recuperarPorCriteria(Map<String, Object> criteria) throws SQLException {

mas a principio esta certo. tem hr q mecho ali e o erro muda para : return statement

l

Como disse no último post: posta o erro, se não fica difícil…

Outra coisa: Porque usando o mapa na visão? Você criou a sua classe que fornecerá os serviços para a visão?
Concorda que não fica muito mais simples criar os métodos de pesquisa específicos no serviço e, dentro deles, fazer a adição dos valores ao mapa para a pesquisa?

Nicolas, não tenho duvidas que se eu souber implementar dessa forma que você me ensinou, vai ficar muito bom, prático.
Como te disse, deu o erro na linha quando crio a List,Map e quando crio os metodos no add.
Mas vou chegar hj pegar os código e amanhã te mostro certinho.
Obrigado por enquanto.

efc,

quando eu digo “postar o erro”, eu quero que você rode seu programa, faça o processamento até dar a mensagem de erro e poste ela aqui. Só assim dá pra eu entender o seu erro, pois não vejo o código que você está usando.

Outra coisa: zipa o seu código e coloca ele em uma postagem sua aqui. Eu vou analisá-lo e te dar um feedback sobre!
Abraços!