Boa tarde!
Preciso fazer uma busca no banco, mas essa busca pode ou não conter vários parametros.
Sou novo no Hibernate. Existe alguma maneira de fazer uma busca com múltiplos parametros de forma rápida?
Estou fazendo assim:
[code]
if (!atendimento.getAssunto().getCodigoAssunto().equals(0)
&& atendimento.getUsuarioEmitente().getCodigoUsuario().equals(0)
&& atendimento.getUsuarioDestinatario().getCodigoUsuario().equals(0)
&& atendimento.getSituacaoAtendimento() == null
&& atendimento.getDescricao().equals("")
&& atendimento.getSolucao().equals("")
&& atendimento.getCadastroCliente().getCodigoCadastro().equals(0)) {
DetachedCriteria criteria = DetachedCriteria.forClass(Atendimento.class);
criteria.add(Restrictions.eq("assunto", atendimento.getAssunto()));
criteria.addOrder(Order.desc("codigoAtendimento"));
return getHibernateTemplate().findByCriteria(criteria);
}[/code]
E assim irei criar “if’s” com todas as possibilidades de busca.
Porém fazer esse tanto de if com cada um usando uma query diferente fica muito pouco produtivo.
Alguem saberia me dizer como fazer essa busca?
Agradeço as possíveis respostas!
Map, meu camarada, map.
public List<?> metodoQueBuscaPorVariosParametros(Class<?> clazz, Map<String, Object> params){
Iterator<String> keys = params.keySet().iterator();
while(keys.hasNext()){
final String key = keys.next();
final Object obj = params.get(key);
DetachedCriteria criteria = DetachedCriteria.forClass(clazz);
//validação opcional, apenas para ver se é String
if(obj instanceof String){
criteria.add(Restrictions.ilike(key, "%" + obj.toString() + "%"));
}else{
criteria.add(Restrictions.equals(key, obj));//Ah sim, as chaves do mapa são os atributos do teu bean...
}
}
//Outras coisas aqui, como o orderBy...
return getHibernateTemplate().findByCriteria(criteria);
}
Você pode também usar o like na consulta. Mas seria bom garantir que pelo um parâmetro veio preenchido senão a consulta retorna todo mundo.
[]'s
Desculpe mas ainda apanho muito dos Maps… eu sei vergonhoso. 
@SuppressWarnings("unchecked")
public List<Atendimento> buscarAtendimentos(Class<?> clazz, Map<String, Object> params){
Iterator<String> keys = params.keySet().iterator();
DetachedCriteria criteria = DetachedCriteria.forClass(clazz);
while(keys.hasNext()){
final String key = keys.next();
final Object obj = params.get(key);
//validação opcional, apenas para ver se é String
if(obj instanceof String){
criteria.add(Restrictions.ilike(key, "%" + obj.toString() + "%"));
}else{
criteria.add(Restrictions.eq(key, obj));//Ah sim, as chaves do mapa são os atributos do teu bean...
}
}
//Outras coisas aqui, como o orderBy...
return getHibernateTemplate().findByCriteria(criteria);
}
Aqui eu chamo o método:
buscarParametros = new HashMap<String, Object>();
buscarParametros.put(cadastrarAtendimentoMB.getAtendimento().getDescricao(), cadastrarAtendimentoMB.getAtendimento());
Chamando o método do DAO:
List<Atendimento> lista = cadastroAtendimentoDAO.buscarAtendimentos(Atendimento.class, buscarParametros);
Dessa maneira só da nullPointer em:
Iterator<String> keys = params.keySet().iterator();
Sei que estou passando algo nulo, mas já tentei passar os parametros de várias formas diferentes e nada. Devo estar errando algo no conceito de Maps.
Se sabe que passa algo nulo, por que não faz um debug e identifica?
Pelo que estou entendendo, o seu Map está indo null para o método.
Então, o ideal seria você passar o método todo, não apenas as partes dele, para uma análise mais adequada.
Apanhei muito, mas consegui!
Fiz poucas alterações no método.
@SuppressWarnings("unchecked")
public List<Atendimento> buscarAtendimentos(Class<?> clazz, Map<String, Object> params){
Iterator<String> keys = params.keySet().iterator();
DetachedCriteria criteria = DetachedCriteria.forClass(clazz);
while(keys.hasNext()){
final String key = keys.next();
final Object obj = params.get(key);
if(obj instanceof String){
if (key == "descricao") {
criteria.add(Restrictions.or(Restrictions.ilike("descricao", "%" + obj.toString() + "%"),Restrictions.ilike("solucao", "%" + obj.toString() + "%")));
}
else{
criteria.add(Restrictions.ilike(key, "%" + obj.toString() + "%"));
}
}else{
criteria.add(Restrictions.eq(key, obj));
}
}
criteria.addOrder(Order.desc("codigoAtendimento"));
return getHibernateTemplate().findByCriteria(criteria);
}
Obrigado pela ajuda.
Opa, tranquilo.
O importante é que você atinja seu objetivo.
Bacana ver que você insistiu e não apenas ficou no básico.
Legal isso.