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:
[code]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"))
);[/code]
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:
Alguem pode me ajudar a ver o que pode ser?