Setando vários parametros em um HQL

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