[HQL] Problema com INNER JOIN e MAX

Boa noite pessoal,

Tenho uma consulta em SQL e há uma semana venho tentando transforma-la em HQL, sem sucesso.

Tenho um banco de dados que guarda o horário que os funcionários bateram o ponto de entrada, junto com seu ID.

Exemplo:

[code]TABELA PONTO

data idFuncionario
2014-04-10 09:05:15 1
2014-04-11 09:09:37 1
2014-04-12 09:06:25 1
2014-04-13 09:12:46 1
2014-04-10 09:05:18 2
2014-04-11 08:37:47 2
2014-04-12 09:05:56 2
2014-04-13 08:45:43 2
2014-04-10 10:33:33 3
2014-04-11 09:15:34 3
2014-04-12 08:56:27 3
2014-04-13 09:32:19 3

[/code]

Eu preciso selecionar a data da última vez que cada funcionário bateu o ponto. A query em SQL é a seguinte:

[color=blue]SELECT *[/color]
[color=blue]FROM [/color][color=red]ponto[/color]
[color=blue]INNER JOIN[/color]
[color=blue] (SELECT [/color][color=red]ponto[/color].[color=olive]idFuncionario id [/color], [color=darkblue]MAX/color AS[/color][color=olive] maxPonto [/color][color=blue]FROM[/color] [color=red]ponto[/color][color=blue] GROUP BY [/color][color=olive]idFuncionario)[/color][color=blue] AS [/color][color=olive]maxSelect [/color]
[color=blue]ON [/color][color=red]ponto[/color].[color=olive]idFuncionario[/color] = [color=olive]maxSelect.id [/color] [color=blue] AND[/color] [color=red]ponto[/color].[color=olive]data[/color] = [color=olive]maxSelect.maxPonto[/color]
[color=blue]ORDER BY [/color][color=olive]maxPonto[/color]

Ela me retorna corretamente os valores:

[code]TABELA PONTO

data idFuncionario id maxPonto
2014-04-13 09:12:46 1 1 2014-04-13 09:12:46
2014-04-13 08:45:43 2 2 2014-04-13 08:45:43
2014-04-13 09:32:19 3 3 2014-04-13 09:32:19
[/code]

Mas não consegui transformar isso em HQL, alguém pode me ajudar?

Obrigado!

Poste as classes envolvidas e o HQL que você tentou fazer, para que o pessoal tenha possibilidade de conseguir ajudar.

Se a consulta tem tendência a ficar complexa prefira usar SQL nativo mesmo, usando o próprio Hibernate através de “Named SQL queries”. Você já tem a solução e pode estar quebrando a cabeça sem necessidade, com algo que poderá ser mais difícil de manter. Para relatórios eu sempre uso Named SQL queries, mas isso é uma decisão particular minha e da equipe, considere o que for melhor para você.

Acredito que não há como fazer essa consulta em HQL pois no manual diz:

http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/#queryhql-subqueries

Note that HQL subqueries can occur only in the select or where clauses.

//Essa é obvio que não funciona, pois a subquery está trazendo mais de 1 resultado
From Ponto p where p.data = (select max(pt.data) from Ponto pt where p.idFuncionario = pt.idFuncionario group by pt.idFuncionario)


//Essa da erro de casting
//java.sql.Timestamp cannot be cast to com.xxx.Ponto
select max(p.data) From Ponto p group by p.idFuncionario


//Essa da erro de casting
//Ljava.lang.Object; cannot be cast to com.xxx.Ponto
select m, max(p.data) From Ponto p group by p.idFuncionario

Tente usar o CreateQuery e o CreateNativeQuery para sua consulta.