Passa o objeto que possui todos os atributos e na implementação do seu DAO, você verifica se o cara é nulo e caso contrário coloca ele no where do SELECT.
Dica: se estiver usando Hibernate (não JPA), use a API de Criteria.
leandroleo
mas dessa forma ele vai retornar o mesmo objeto nao ??
mas meu pode retornar varias ocorrencias!!
e eu tambem posso fazer um filtro como por exemplo:
ver quais clientes fizemos cadastro entre 2 datas.
ainda to sem entender!!
Nicolas_Fernandes
Eu faço uso de um método bem simples, o qual eu chamo readByCriteria. Já ouviu falar na estrutura de dados Map, do Java? Pois bem, eu passo um mapa de critérios para o método, e ele se vira para rearranjar a query da maneira dos critérios. Por exemplo, suponhamos que eu queira buscar os alunos que foram cadastrados entre duas datas:
publicList<Aluno>readByCriteria(Map<String,Object>criteria)throwsException{Stringquery="Select * From Alunos Where True ";if(criteria!=null){// Caso queira pesquisar por nome...if(criteria.containsKey("nome"))query.concat("And Nome Like '%"+criteria.get("nome").toString()+"%' ");// Caso queira pesquisar por status...if(criteria.containsKey("status"))query.concat("And Status = "+criteria.get("status").toString()+" ");// Caso queira pesquisar por data...if(criteria.containsKey("dataInicio")&&criteria.containsKey("dataTermino"))query.concat("And Data Between "+criteria.get("dataInicio").toString()+" And "+criteria.get("dataTermino").toString()+" ");// E o resto é feito aqui...}}
Traduzindo: você deve manipular todo tipo de pesquisa que você acha que vai fazer e tratar ali… Daí, é só passar os valores pelo mapa de critérios e voilà!
Espero ter sido útil!
Abraços!
leandroleo
Opa!! baum demais, vlw mesmo!
vai ser muito util!!
to começando agora em padrões e volta e meia surge duvidas…
brigadão!!
laudenpower
Nicolas Fernandes:
Eu faço uso de um método bem simples, o qual eu chamo readByCriteria. Já ouviu falar na estrutura de dados Map, do Java? Pois bem, eu passo um mapa de critérios para o método, e ele se vira para rearranjar a query da maneira dos critérios. Por exemplo, suponhamos que eu queira buscar os alunos que foram cadastrados entre duas datas:
publicList<Aluno>readByCriteria(Map<String,Object>criteria)throwsException{Stringquery="Select * From Alunos Where True ";if(criteria!=null){// Caso queira pesquisar por nome...if(criteria.containsKey("nome"))query.concat("And Nome Like '%"+criteria.get("nome").toString()+"%' ");// Caso queira pesquisar por status...if(criteria.containsKey("status"))query.concat("And Status = "+criteria.get("status").toString()+" ");// Caso queira pesquisar por data...if(criteria.containsKey("dataInicio")&&criteria.containsKey("dataTermino"))query.concat("And Data Between "+criteria.get("dataInicio").toString()+" And "+criteria.get("dataTermino").toString()+" ");// E o resto é feito aqui...}}
Traduzindo: você deve manipular todo tipo de pesquisa que você acha que vai fazer e tratar ali… Daí, é só passar os valores pelo mapa de critérios e voilà!
Espero ter sido útil!
Abraços!
Mas ai você está fazendo uso do JPA ou JDBC puro?
Pergunto isso por que se for JDBC puro ao concatenar a consulta em uma String você possibilita o SQL Injection e isso pode prejudicar a segurança da aplicação. Se você usa isso junto com PreparedStatement e os coringas ("?") ai não tem problema.
leandroleo
eu to usando o jdbc purro
mas eu uso o prepared statement tbm.
vlw
tnaires
Passar o próprio objeto é complicado, porque nesse caso o único atributo relevante é o id do cliente. E criar um objeto Cliente apenas com o id inicializado, tendo todos os outros atributos nulos, nem sempre é possível devido às regras de consistência. Exemplo: um objeto Cliente pode ser criado com o nome nulo?
PauloBrito
Para complementar as dicas: procure pelo padrão QueryObject.
Abraços.
Nicolas_Fernandes
laudenpower:
Mas ai você está fazendo uso do JPA ou JDBC puro?
Pergunto isso por que se for JDBC puro ao concatenar a consulta em uma String você possibilita o SQL Injection e isso pode prejudicar a segurança da aplicação. Se você usa isso junto com PreparedStatement e os coringas ("?") ai não tem problema.
Na verdade, eu faço uma função JavaScript que retira as palavras que possam causar SQL Injection, não necessitando dessa preocupação no meu modelo
leandroleo
Na verdade, eu faço uma função JavaScript que retira as palavras que possam causar SQL Injection, não necessitando dessa preocupação no meu modelo
validar com javaScript é arriscado, pois o usuario pode desativar e dependendo a estrutura da aplicação, td vai por agua abaixo! :shock:
Nicolas_Fernandes
leandroleo:
Na verdade, eu faço uma função JavaScript que retira as palavras que possam causar SQL Injection, não necessitando dessa preocupação no meu modelo
validar com javaScript é arriscado, pois o usuario pode desativar e dependendo a estrutura da aplicação, td vai por agua abaixo! :shock:
Tem esse porém. Mas nada impede de eu criar em minhas classes de Serviço um método que retire as palavras de SQL Injection, do mesmo modo do Javascript!
leandroleo
claro claro!!!
nesse caso sim.
ai é bem melhor
tnaires
Se você usar PreparedStatement como sugeriu o colega laudenpower, pode jogar todo esse código no lixo.