Duvida pesquisar dados no Banco[RESOLVIDO]

Opa Nicolas!
Segue os Códigos do programa.
No pesquisarImoveis, os principais metodos são:

private void listarCliente_Imoveis();

Que busca no banco e joga em uma combobox os clientes que ja foram cadastrados .

e o problemático:
protected void listarImoveis()

quero q ele filtra o que o cliente quizer buscar no banco. Ex: quer buscar pelo: Cliente, Tipo do Imovel, valor etc…, ai ele retornar as buscas na tabela e me mostra os que tem aquilo q ele selecionou.

na verdade não implementei o codigo com os chekbox pois ainda estava fazendo teste com aquela forma q vc mostrou. Desta forma q esta ele não esta fazendo a busca pelo q eu quero. ele retorna na tabela tudo q tem lá…

VAleu

O código ta meio bagunçado…

Putz, cara!
Ainda tá com o meu código aí?
Agora que saquei o que você quis dizer do Map…
Desculpa, eu tô mexendo com .NET, e os mapas lá eu uso .add()… No JAVA, eu adiciono no Map através do .put()!

Então Nicolas…isso mesmo…acabei usando o Put…mas ele não passa pelo criteria q foi criado.
ele lista tudo q ta no banco. Ele não faz o filtro.

Faça um teste: ao invés de usar parâmetros, concatene o parâmetro com o String.format().


String sentencaSelect = "SELECT * FROM DBO.IMOVEIS WHERE 1 = 1";
if (criteria != null) {
   
    if (criteria.containsKey("endereco")) {
        sentencaSelect = String.format("%s AND UPPER(ENDERECO) LIKE '%s'", 
            sentencaSelect, String.valueOf(criteria.get("endereco")).toUpperCase());
    } 
  
    if (criteria.containsKey("status")) {
        sentencaSelect = String.format("%s AND UPPER(STATUS) LIKE '%s'", 
            sentencaSelect, String.valueOf(criteria.get("status")).toUpperCase());
    } 
}
PreparedStatement statementSelect = connection.prepareStatement(sentencaSelect);
ResultSet resultSelect = statement.executeQuery();
//...

Essas linhas do Criteria eu tinha comentado tudo…ele nem passava por ela…

Então como você quer que filtre alguma coisa se você comenta os filtros? --’

Aqueles comentários foram apenas para ver se estava passando por aquela regra ou não.
Resumindo: eu comentando ou não o resultado é o mesmo.
Se vc verificar la onde tem o metodo Listas clientes Imoveis, voce vai ver q eu coloquei certinho como vc pediu mas quando vai me retornar ele me retona tudo q esta no banco. e não apenas o que eu pedi.
Lá eu fiquei fazendo testes, primeiro pedi que quando eu selecionar o cliente q ja esta na combobox ele vai até o banco e me pucha os dados daquele cliente.
se eu selecionar o Tipo (dentro dessa combobox tem: casa, apto) ele me traga o q tem la no banco sobre isso. Se funcionar assim, depois vou colocar um checkbox em cada opção para o cliente buscar pelo q ele quiser, seja por: cliente, valor, tipo…etc…
Se voce perceber nesse metodo tem umas linhas q eu tinha comentado q funcionavam , mas ele permite buscar apenas uma String, justamente pq la no Controlador a List só da pra colocar uma String, até da pra colocar várias, mas ai nao tem como eu fazer a busca separada, pelo menos eu nao sei.

Nicolas…deu certinho aqui seu código…agora funcionou perfeitamente.
A unica duvida é o seguinte:
Eu coloquei Jcheckbox e quando selecionar determinada opção ele mostra na tabela.
Mas ele não consegue filtrar pra mim mais de uma Opção.
quero q quando o cliente selecionar mais de uma opção ele mostra pra mim na tabela tudo q pedi.

Bom, quando você usa JCheckBoxes, existem vários filtros que você vai usar de uma vez só na pesquisa.
Eu vejo duas soluções para a situação:

  1. Na sua classe de serviços, criar um método de pesquisa genérico:

[code]public class ServicosImovel {

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

    PersistenciaImovel persistenciaImovel = new PersistenciaImovel();
    return persistenciaImovel.recuperarPorCriteria(criteria);
}

}[/code]

e, no seu evento de pesquisar:

Map<String, Object> criteria = new HashMap<String, Object>();
if (checkboxCampo1.isChecked()) {

   criteria.add("chaveDoCampo1", campo1);
}
if (checkboxCampo2.isChecked()) {

   criteria.add("chaveDoCampo2", campo2);
}

ServicosImovel servicosImovel = new ServicosImovel();
List<Imovel> imoveis = servicosImovel.recuperarImoveisPorCriteria(criteria);
  1. Realizar uma busca para cada um dos filtros específicos e juntar os registros, sem repetição, para que formem uma coleção única e distinta:

[code]public class ServicosImovel {

public List<Imovel> recuperarListaDistinta(List<Imovel> original, List<Imovel> imoveis) {
  
    // ESSE MÉTODO SERVE PARA PEGAR OS VALORES DAS LISTAS QUE VOCÊ
    // PESQUISOU E JUNTAR PARA UMA LISTA ÚNICA E DISTINTA.

    // OBS: FIZ NO OLHO; SE FOR USAR ESSA SOLUÇÃO, ME FALA QUE A GENTE
    // PENSA NELE CORRETAMENTE, É SÓ PRA VOCÊ TER UMA IDEIA.

    List<Imovel> imoveisDistintos = new ArrayList<Imovel>();
    for (List<Imovel> imovel : imoveis) {
            if (!original.contains(imovel))
                imoveisDistintos.add(imovel);
    }
    return imoveisDistintos;
}

public List<Imovel> recuperarImoveisPorFiltro1(String filtro1) throws SQLException {

    PersistenciaImovel persistenciaImovel = new PersistenciaImovel();
    Map<String, Object> criteria = new HashMap<String, Object>();

    criteria.add("filtro1", filtro1);
    return persistenciaImovel.recuperarPorCriteria(criteria);
}

public List<Imovel> recuperarImoveisPorFiltro2(String filtro2) throws SQLException {

    PersistenciaImovel persistenciaImovel = new PersistenciaImovel();
    Map<String, Object> criteria = new HashMap<String, Object>();

    criteria.add("filtro2", filtro2);
    return persistenciaImovel.recuperarPorCriteria(criteria);
}

}[/code]

e, no seu evento de pesquisa:

ServicosImovel servicosImovel = new ServicosImovel();
List<Imovel> imoveis = new ArrayList<Imovel>();
List<Imovel> temp = new ArrayList<Imovel>();

if (checkboxEndereco.isChecked()) {

    temp = servicosImovel.recuperarPorEndereco("Endereço qualquer");
    imoveis = servicosImovel.recuperarListaDistinta(imoveis, temp);
}
if (checkboxStatus.isChecked()) {

    temp = servicosImovel.recuperarPorStatus("Status qualquer");
    imoveis = servicosImovel.recuperarListaDistinta(imoveis, temp);
}

Se tiver alguma outra ideia, posta ela aí que vamos desenvolvendo-a!

Valeu Nicolas…Solucionou meu problema…

Muito Obrigado…

[RESOLVIDO]

efc, 2 coisas:

  1. Coloque a tag [RESOLVIDO] no tópico, não no post.
  2. Poste sua solução para que os outros possam fazer uso dela quando precisarem!

Abraços!

Opa…Valeu Nicolas… Eu havia colocado ao lado do tópico, é isso?!?

Seguinte:

A Solução foi realmente o que o Nicolas ja mencionou acima. A opção por Criteria, pois eu queria fazer o tratamento no banco separadamente, individual. Então a List não poderia ter parâmetro algum e também não podia ser vazia. Após isso, o restante foi tranquilo, foi colocado um jCheckBox para cada opção, o Cliente filtra a pesquisa da forma que quizer, ele traz pra ele o que interessa.

Valeu Nicolas, muito Obrigado…Tava ficando louco com isso.

Galera… não to conseguindo efetuar uma pesquisa no JTextField, deem uma olhada no meu código por favor

public void pesquisar() { // try // { // con_cadastro.resultset.first(); // String query = "SELECT * FROM tbl_cadastro WHERE cad_nome LIKE '%" // + jtxt_pesquisar.getText() + "%' OR '%" // + jtxt_pesquisar.getText().toUpperCase() + "%' OR '%" // + jtxt_pesquisar.getText().toLowerCase() + "%'"; // con_cadastro.statement.executeQuery(query); // con_cadastro.resultset = con_cadastro.statement.executeQuery("select * from tbl_cadastro"); // mostra_dados(); // // // } // catch(Exception erro) // { // JOptionPane.showMessageDialog(null,"Não achou!"); // } try { con_cadastro.resultset.first(); String igual = "n"; int tamanho_pesquisa = jtxt_pesquisar.getText().length(); while(igual == "n") { String pesquisado = con_cadastro.resultset.getString("cad_nome").substring(0,(tamanho_pesquisa)); if (pesquisado.equals(jtxt_pesquisar.getText())) { igual = "s"; } else { con_cadastro.resultset.next(); } jtxt_codigo.setText(con_cadastro.resultset.getString("cad_codigo")); mostra_dados(); } }
Obs.: sou totalmente iniciante em java, estou aprendendo com as vídeo aulas do prof Neri Neitzke.
Obrigado