Como criar consultas personalizadas pelo usuário

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.

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?

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

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:

[code]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;
 }

}
[/code]

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:

[code]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());
    }
}

}[/code]