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]