Pessoal,
Estou com problemas para formular uma HQL. Como faço para setar vários parametros utilizando um objeto da Classe Query?
Segue meu codigo abaixo:
public List<MensagemPergunta> listarPerguntasPorPerguntadorEFiltro(RegiaoAtendimento regiao, Categoria categoria,
UsuarioAE especialista, Classificacao instituicao) {
StringBuilder hql = new StringBuilder();
hql.append("FROM MensagemPergunta ");
Query query = getCurrentSession().createQuery(hql.toString());
if(categoria.getId() != null || especialista.getId() != null){
hql.append("WHERE ");
}
if(categoria.getId() != null){
hql.append("categoria = :categoria");
query = getCurrentSession().createQuery(hql.toString());
query.setParameter("categoria", categoria);
if(especialista.getId() != null || regiao.getId() != null || instituicao.getId() != null) hql.append(" AND ");
}
if(especialista.getId() != null){
hql.append("usuario = :especialista");
query = getCurrentSession().createQuery(hql.toString());
query.setParameter("especialista", especialista);
}
return query.list();
}
O problema está nos setParameter. Se eu setar o segundo parametro, eu perco o primeiro. Queria uma forma de poder especificar quantos parametros eu quiser.
Obrigado.
amigo,
vc esta perdendo o parametro pq vc chama o metodo setParameter na primeira condicional e apos isso o metodo createQuery pode ser chamado novamente, retornando assim um novo objeto Query.
se voce usar criteria no lugar de hql, nesse caso, acho que seu codigo ficaria mais manutenível ( gastei o vocabulario agora rs )
abrassss
Eu bem que tentei usar criteria, mas nao consegui…
Eu preciso acessar uns atributos concatenados, como por exemplo…
usuario.classInstituicao = :instituicao
Quando tento usar isso com criteria, o compilador diz que nao reconhece o usuario.classInstituicao.
Já quando uso com HQL, funciona. O que pode ser?
voce nao esta tentando utilizar o atributo classInstituicao da classe usuario nesse hql… por isso nao esta sendo gerado o erro.
sua classe possui esse atributo realmente ?
Sim… Possui o atributo e eu estou usando sim, sem dar erro.
Essa clausula, por exemplo, no HQL está funcionando. Mas no criteria nao funciona…
beleza, quando for assim, poste o codigo e o erro que esta sendo gerado…
voltando ao codigo que usa criteria, vc perde os parametros por chamar o metodo createQuery()…
query = getCurrentSession().createQuery(hql.toString());
voce precisa organizar suas condicionais para que esse metodo seja chamado apenas depois de concatenar toda sua hql e entao chamar os metodos setParameter.
Se voce chamar o metodo setParameter() e depois criar uma nova query voce perde os parametros que ja setou…
fui claro ?
abrasssssss