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?
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.
publicList<?>metodoQueBuscaPorVariosParametros(Class<?>clazz,Map<String,Object>params){Iterator<String>keys=params.keySet().iterator();while(keys.hasNext()){finalStringkey=keys.next();finalObjectobj=params.get(key);DetachedCriteriacriteria=DetachedCriteria.forClass(clazz);//validação opcional, apenas para ver se é Stringif(objinstanceofString){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...returngetHibernateTemplate().findByCriteria(criteria);}
bastides
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
Cledsonjr
Desculpe mas ainda apanho muito dos Maps… eu sei vergonhoso.
@SuppressWarnings("unchecked")publicList<Atendimento>buscarAtendimentos(Class<?>clazz,Map<String,Object>params){Iterator<String>keys=params.keySet().iterator();DetachedCriteriacriteria=DetachedCriteria.forClass(clazz);while(keys.hasNext()){finalStringkey=keys.next();finalObjectobj=params.get(key);//validação opcional, apenas para ver se é String if(objinstanceofString){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... returngetHibernateTemplate().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);
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.
drsmachado
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.