Como criar consultas personalizadas pelo usuário

4 respostas
lordtiago

Boa tarde,
estou com o seguinte problema galera.
O usuário de uma aplicação a ser desenvolvida está precisando que o programa realize consultas, porém ele quer selecionar quais campos serão consultados. Por exemplo:

tabela conta

mes;

ano;

valor;

ele quer que a GUI permita montar a consulta por mes, ano, valor, todos, ou uma combinação dos dois. Porém a tabela é bem maior, e eu realizar uma consulta com cada combinação de campos, fica inviável.
Alguém conhece alguma ferramenta que permita passar parâmetros como o campo ou combinação de campos a ser pesquisado?
Tem algum livro bom a ser estudado?
Hybernate faz isso?
Desde já obrigado.

4 Respostas

blackout

Crie uma tela com essas opções como checkbox, quando teu método receber esses parametros, verifique quais deles está “checkado” e então adicione na tua clausula where.

Entendeu mais ou menos?

Leonardo_Gloria

O Hibernate tem um negócio bacana chamado Example… dah uma pesquisada nisso acho q vai ter ajudar… Query By Example… QQ dúvida posta ae

[]s!
Leonardo Gloria

lordtiago
Boa tarde, segui a dica de vocês, demorei um pouquinho mas consegui implementar. Fiz um esquema igual o blackout sugeriu e caiu muito bem:
public class QueryCreator {

 private String sqlTelCampos = "SELECT cobranca.TipoCobranca, cobrancaconta.valor, contaTelefone.telefone FROM cgg.cobrancaconta "+
    "INNER JOIN cgg.cobranca ON (cobrancaconta.idCobranca = cobranca.idCobranca)"+
    " INNER JOIN cgg.contatelefone ON (cobrancaconta.idConta = contatelefone.idConta) ";

     public String lancaWhere (ArrayList<String> tipoCobranca){
         String condicao="(";
         for(int a=0;a<tipoCobranca.size();a++){
             if(a<tipoCobranca.size()-1){
                 condicao=condicao+" tipoCobranca= '"+tipoCobranca.get(a)+"' OR ";
             }else{
                 condicao=condicao+" tipoCobranca= '"+tipoCobranca.get(a)+ "' )";
             }
         }
         return condicao;
     }

     public String montaConsulta(ArrayList<String>tipoCobranca, int opcao, byte mes, int ano){
         String where = "";
         if(opcao==0){
             where = "  contatelefone.mes = "+mes+" "+
                "AND contatelefone.ano = "+ano+" AND"+lancaWhere(tipoCobranca);
         }else if(opcao==1){
             if(mes==01){
                where = " (contatelefone.mes = 01 OR contatelefone.mes = 02 OR " +
                         "contatelefone.mes = 03) AND contatelefone.ano = "+ano+" AND"+lancaWhere(tipoCobranca);
             }else if(mes==02){
                 where = " (contatelefone.mes = 04 OR contatelefone.mes = 05 OR " +
                         "contatelefone.mes = 06) AND contatelefone.ano = "+ano+" AND"+lancaWhere(tipoCobranca);
             }else if(mes==03){
                 where = " (contatelefone.mes = 07 OR contatelefone.mes = 08 OR " +
                         "contatelefone.mes = 09) AND contatelefone.ano = "+ano+" AND"+lancaWhere(tipoCobranca);
             }else if(mes==04){
                 where = " (contatelefone.mes = 10 OR contatelefone.mes = 11 OR " +
                         "contatelefone.mes = 12) AND contatelefone.ano = "+ano+" AND"+lancaWhere(tipoCobranca);
             }
         }
         where=where+" group by contaTelefone.telefone";
         //sqlTelCampos = sqlTelCampos+where;
     
     //return sqlTelCampos;
         return where;
     }
}
lordtiago

também crei uma classe para criação de queries mais cabreiras, quando é necessário personalizar o campo a se criar. Esta classe é apenas para testes, visto que não precisei implementar em produção. Contudo estou estudando segundo o Leonardo Glória sugeriu, daí já conseguirei penar menos para criar minhas queries, heheheh
mais uma vez obrigado a todos pela ajuda e segue a classe de exemplo para quem tiver com dificuldades na mesma linha de problema:

public class ConsultasPersonalizadas {

    public   static ArrayList<ContaTelefone> find(ArrayList<String> campos) throws SQLException{
        Conexao con = new Conexao();
        String sql = "SELECT * from contatelefone " ;
        ResultSet rs = con.consultaDados(sql);
        ArrayList<ContaTelefone> e = new ArrayList<ContaTelefone>();

        while (rs.next()) {
            ContaTelefone menu = new ContaTelefone();
                    for(int i = 0; i<campos.size();i++){
                        if(campos.get(i).equals("idConta")) menu.setIdConta(rs.getInt("idConta"));
                        if(campos.get(i).equals("telefone")) menu.setTelefone(rs.getString("telefone"));
                        if(campos.get(i).equals("mes")) menu.setMes(rs.getByte("mes"));
                        if(campos.get(i).equals("ano")) menu.setAno(rs.getShort("ano"));
                        if(campos.get(i).equals("desconto")) menu.setDesconto(rs.getDouble("desconto"));
                        if(campos.get(i).equals("valorTotal")) menu.setValorTotal(rs.getInt("valorTotal"));                        
                    }
            e.add(menu);
            }
        return e;

    }

    public static void main (String args[]){
        ArrayList<String> campos = new ArrayList<String>();
     //   campos.add("idConta");
        campos.add("telefone");
        campos.add("mes");
        campos.add("ano");
     //   campos.add("desconto");
      //  campos.add("valorTotal");

        ArrayList<ContaTelefone> dados = new ArrayList<ContaTelefone>();
        try {
                dados = find(campos);
        } catch (SQLException ex) {
            Logger.getLogger(ConsultasPersonalizadas.class.getName()).log(Level.SEVERE, null, ex);
        }

        for(int i=0;i<dados.size();i++){
         System.out.println("Registro "+i);
         if(dados.get(i).getIdConta()!=0) System.out.println(dados.get(i).getIdConta());
         if(dados.get(i).getTelefone()!="")System.out.println(dados.get(i).getTelefone());
         if(dados.get(i).getMes()!=0)System.out.println(dados.get(i).getMes());
         if(dados.get(i).getAno()!=0)System.out.println(dados.get(i).getAno());
         if(dados.get(i).getDesconto()!=0.0)System.out.println(dados.get(i).getDesconto());
         if(dados.get(i).getValorTotal()!=0.0)System.out.println(dados.get(i).getValorTotal());
        }
    }
}
Criado 12 de julho de 2010
Ultima resposta 19 de jul. de 2010
Respostas 4
Participantes 3