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.
L
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!!
N
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!
L
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!!
L
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.
L
leandroleo
eu to usando o jdbc purro
mas eu uso o prepared statement tbm.
vlw
T
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?
P
PauloBrito
Para complementar as dicas: procure pelo padrão QueryObject.
Abraços.
N
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
L
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:
N
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!
L
leandroleo
claro claro!!!
nesse caso sim.
ai é bem melhor
T
tnaires
Se você usar PreparedStatement como sugeriu o colega laudenpower, pode jogar todo esse código no lixo.