Oi Anderson,
há algo similar na implementação do /dev/All - http://www.devall.com.br
Vou lhe dizer como fizemos no banco de dados, talvez isto te ajude.
Nós possuímos uma tabela na qual armazenamos a hora em que alguém clicou sobre um link: estas informações são usadas na exposição do ranking semanal e mensal, que pode ser visto neste link: http://devall.com.br/rank/index
Esta entidade que usamos para registrar o clique (e que bate com a sua necessidade do acesso), é similar à exposta abaixo:
class Clique {
Date data
Post post
}
Observe que como consequencia, estamos usando um campo do tipo timestamp no banco de dados para armazenar a data do clique. Então, como separar dia, mês e ano?
A solução que encontramos foi a criação de uma view no próprio banco de dados, cuja implementação é similar à exposta abaixo:
create view acessos_decompostos as
select id, day(data) as dia, month(data) as mes, year(data) as ano from clique
Logo na sequência, caso desejemos agrupar estes dados, há dois caminhos: ou criamos uma view para a agrupação pelo dia, mês e ano ou não.
Vamos para o primeiro caso: se criamos uma view que já agrupa por mês e ano, tudo o que fazemos na sequência é mapear uma classe de domínio para esta nova view: seu problema está resolvido.
Se não for para criar uma nova view, mas sim apenas a original, basta que você siga dois passos:
1) Crie uma classe de domínio que seja mapeada contra a view original
2) Use criterias com as instruções groupProperty ou HQL usando as funções de group by para obter o resultado que você deseja.