Hibernate Subquery + Inner Join

0 respostas
B

Boa noite!

Preciso buscar as últimas mensagens de cada pessoa em um banco de dados.

A query que uso direto no banco é essa, que funciona beleza:

SELECT *
FROM mensagem
INNER JOIN 
(SELECT Msg_IdPessoa AS id, MAX(Msg_Data) AS maxData
FROM mensagem
GROUP BY Msg_IdPessoa) AS sub 
ON mensagem.Msg_IdPessoa = sub.id AND mensagem.Msg_Data = sub.maxData

Com isso, tentei fazer a consulta com Criteria e Projections do Hibernate:

Criteria criteria = sessionFactory.getCurrentSession().createCriteria(Mensagem.class, "mensagem") 
			.setProjection( Projections.projectionList()
		
		        .add(Projections.property("mensagem.idPessoa"),"idPessoa")
		        .add(Projections.property("mensagem.data"),"data")
		        .add(Projections.property("mensagem.texto"),"texto")
		        .add(Projections.property("mensagem.idMensagem"),"idMensagem")
		        .add(Projections.max("data"))
		        .add(Projections.groupProperty("idPessoa"))
		    );

Mas ele me retorna o grupo de mensagens, mas a primeira de cada pessoa.

Quando utilizei subquery, ele me diz que está retornando mais de uma linha dela (Claro que irá retornar, a última de cada pessoa!)
DetachedCriteria maxDateQuery = DetachedCriteria.forClass(Mensagem.class, "sub");
		ProjectionList proj = Projections.projectionList();
		proj.add(Projections.max("sub.data"),"maxData");
		proj.add(Projections.groupProperty("sub.idPessoa"),"id");
		maxDateQuery.setProjection(proj);

Acho que estou errando no modo que fiz a "junção" da query com a subquery que foi dessa forma:

.add(Subqueries.propertiesEq(new String[] {"data","idPessoa"}, maxDateQuery))

Alguem pode me ajudar a ver o que pode ser?

Criado 4 de outubro de 2013
Respostas 0
Participantes 1