Listar usando query do Hibernate [Resolvido]

Olá pessoal!
Tô com este problema que não consegui resolver em nenhum manual.
Tenho esta tabela Mensagem:

Quero pegar a coluna assunto e mensagem pela fk:

@SuppressWarnings("unchecked")
	public List<String> lista(Long idContato) {		
		return session.createQuery("select m.assunto, m.mensagem from Mensagem m where m.contato.id = :id")  
        .setParameter("id", idContato).list();
	}

Envio para a JSP do meu controller assim:

public void view(Long idContato) {
		result.include("mensagem", mensagemDAO.lista(idContato));
	}

Na JSP pego assim:

<c:forEach var="mensagem" items="${mensagemList}">
<td>${assunto }</td>
<td>${mensagem }</td>
</c:forEach>

Ai a porcaria me devolve isto:

org.apache.jasper.JasperException: javax.servlet.ServletException: javax.servlet.jsp.JspException: Exception: [.LookupUtil] Error looking up property "mensagem" in object type "[Ljava.lang.Object;". Cause: Unknown property 'mensagem' on class 'class [Ljava.lang.Object;'

Alguém sabe explicar o pq de não achar a coluna mensagem na tabela Mensagem?
Abraço!

1° - List ??
o Retorno não deveria ser List ??

Verifique o retorno no List que pode esta vindo como Object
:lol:

Dá o mesmo erro colocando List, tô querendo listar os assuntos e mensagens dessa tabela e não carregar um objeto Mensagem. Esse mesmo método funciona para outra tabela e outras classes que eu tenho, é nessa que está dando essa zica.
vlw!

Cara, isso eh uma HQL e nao uma instrucao nativa SQL. Faça assim:

    @SuppressWarnings("unchecked")  
        public List<Mensagem> lista(Long idContato) {         
            return session.createQuery("from Mensagem m where m.contato.id = :id")    
            .setParameter("id", idContato).list();  
        }  

Depois voce manipula as saida dos dados em seu JSP.

//<c:forEach var="mensagem" items="${mensagemList}">  
 <c:forEach var="mensagem" items="#{mensagemList}">    
    <td>${mensagem.assunto}</td>  
    <td>${mensagem.descricao}</td>  
    </c:forEach>  

T+

Vini, não mostrou nada na tela, e ao invés de pegar apenas assunto e mensagem, olha a cacetada de dados que ele foi buscar:

Hibernate: 
    select
        contato0_.id_contato as id1_14_1_,
        contato0_.dt_inclusao as dt2_14_1_,
        contato0_.email as email14_1_,
        contato0_.nome as nome14_1_,
        mensagens1_.contato_id_contato as contato4_14_3_,
        mensagens1_.id_mensagem as id1_3_,
        mensagens1_.id_mensagem as id1_16_0_,
        mensagens1_.assunto as assunto16_0_,
        mensagens1_.contato_id_contato as contato4_16_0_,
        mensagens1_.mensagem as mensagem16_0_ 
    from
        Contato contato0_ 
    left outer join
        Mensagem mensagens1_ 
            on contato0_.id_contato=mensagens1_.contato_id_contato 
    where
        contato0_.id_contato=?

Se nao mostrou nada na tela eh porque o filtro que voce esta realizando nao retorna resultado nenhum. Faça o seguinte, retie o filtro pra ver no que vai dar:

//agora nao tem filtro
return  session.createQuery("from Mensagem m ").list();  

Fiz o teste:
Sem filtro:

public List<String> lista(Long idContato) {         
        return session.createQuery("FROM Mensagem m WHERE m.contato.id = :id")    
        .setParameter("id", idContato).list();  
    }  

O que ele pega do banco:

Hibernate: 
    select
        mensagem0_.id_mensagem as id1_16_,
        mensagem0_.assunto as assunto16_,
        mensagem0_.contato_id_contato as contato4_16_,
        mensagem0_.mensagem as mensagem16_ 
    from
        Mensagem mensagem0_ 
    where
        mensagem0_.contato_id_contato=?
Hibernate: 
    select
        contato0_.id_contato as id1_14_1_,
        contato0_.dt_inclusao as dt2_14_1_,
        contato0_.email as email14_1_,
        contato0_.nome as nome14_1_,
        mensagens1_.contato_id_contato as contato4_14_3_,
        mensagens1_.id_mensagem as id1_3_,
        mensagens1_.id_mensagem as id1_16_0_,
        mensagens1_.assunto as assunto16_0_,
        mensagens1_.contato_id_contato as contato4_16_0_,
        mensagens1_.mensagem as mensagem16_0_ 
    from
        Contato contato0_ 
    left outer join
        Mensagem mensagens1_ 
            on contato0_.id_contato=mensagens1_.contato_id_contato 
    where
        contato0_.id_contato=?

Para mostrar apenas assunto e mensagem na JSP deixei assim:

<c:forEach var="mensagem" items="${mensagem}">  
    <td>${mensagem.assunto}</td>  
    <td>${mensagem.mensagem}</td>  
</c:forEach> 

Dessa forma mostra os dados, mas está fazendo uma consulta desnecessária, preciso apenas de assunto e mensagem da tabela Mensagem.
Agora, aplicando a filtragem para mostrar apenas assunto e mensagem, dá problema.
Tõ lendo a documentação e têm um exemplo pequeno, mas dá a entender que a query que eu estava executando está certa.

select p.name from Person p

http://docs.jboss.org/hibernate/core/3.3/reference/en/html/queryhql.html
No meu caso ficaria:

public List<String> lista(Long idContato) {         
        return session.createQuery("SELECT m.assunto, m.mensagem FROM Mensagem m where m.contato.id = :id")    
        .setParameter("id", idContato).list();  
    }  

Ainda não descobri o motivo de não estar dando certo.

Cara, voce tem que se lembrar de que voce esta trabalhando com Orientacao a Objeto e para isso foram feitas as HQL´s (o que eu já fico com o pé atras…rsrsr), portanto, não tem muito sentido voce rechear seu codigo com instruções SQL´s, ainda mais em se tratando de uma situacao simples como essa, isto eh, todas as vezes que voce quiser acessar os dados da tabela “mensagem” voce tera que pedir para o Hibernate te devolver um objeto do tipo Mensagem. Do jeito que voce mapeou suas classes o Hibernate sempre que for construir um objeto do tipo Mensagem ele vai construir um do tipo Contato (pois uma mensagem TEM um Contato), entao desencane das querys que o Hibernate esta executando para montar seus objetos. De qualquer modo, estude um pouco sobre o modo “lazy load” do Hibernate e veja se isso te ajuda.

t+

Obrigado pela ajuda Vini!
Resolvi usando Criteria:

@SuppressWarnings("unchecked")
	public List<Mensagem> lista(Long idContato) { 		
		return session.createCriteria(Mensagem.class, "m")
		.setProjection(Projections.projectionList()
				.add( Projections.property("m.assunto").as("assunto") )
				.add( Projections.property("m.mensagem").as("mensagem") )
				).setResultTransformer(new AliasToBeanResultTransformer(Mensagem.class))
				.add(Restrictions.idEq(idContato))
				.setMaxResults(10).list();
    }  

Mais OO que isso impossível! :smiley:
Agora ele lista desta forma:

Hibernate: 
    select
        this_.assunto as y0_,
        this_.mensagem as y1_ 
    from
        Mensagem this_ 
    where
        this_.id_mensagem = ? limit ?

Na JSP ficou:

<c:forEach var="mensagem" items="${mensagem}">  
    <td>${mensagem.assunto}</td>  
    <td>${mensagem.mensagem}</td>  
</c:forEach> 

Abraço!