JPA2 + Hibernate – Criando Funções Customizadas

Olá Galera!

Neste post vou dar uma dica bem bacana de como customizar funções de banco que podem ser chamadas a partir de uma consulta JPQL.

O cenário que vou descrever aqui como exemplo é um dos que provavelmente mais exigirão esta abordagem.

Considere os seguintes registros em uma tabela de movimentações:

Captura de tela de 2017-11-15 13:12:57

Imagine então que você precise recuperar uma média dos valores destas movimentações por dia, usando a JPQL. Uma primeira implementação poderia ser como a do método de teste abaixo:

Captura de tela de 2017-11-15 14:26:12

O resultado desta execução será o seguinte:

Captura de tela de 2017-11-15 14:26:55

Claramente o resultado não foi o que esperávamos. Temos apenas dois dias específicos com movimentações, mas o resultado não veio agrupado.

O problema está no fato de que a data das movimentações é armazenada juntamente com a hora, ou seja, um TIMESTAMP. Armazenar apenas a data em algumas situações, ignorando a hora, não é uma opção, e precisamos encontrar uma forma de conseguir agrupar apenas pela data.

A mesma consulta, executada diretamente no banco de dados com a utilização de uma função, resolve o problema, trazendo o resultado esperado:

Captura de tela de 2017-11-15 14:32:45

A questão é: como utilizar este tipo de função na consulta JPQL?

A resposta está na customização do dialeto utilizado pelo Hibernate. Abaixo um exemplo de implementação que nos ajudará a resolver o problema acima:

Captura de tela de 2017-11-15 14:40:37

Nesta implementação estamos estendendo a classe PostgreSQL95Dialect, registrando uma function chamada “truncate_date” cuja implementação chama a função DATE do Postgres com um parâmetro. A classe a ser estendida pode ser uma de várias disponíveis na API.

Depois de implementada precisamos registrar nossa customização na configuração do persistence.xml:

Captura de tela de 2017-11-15 14:45:31

Agora basta ajustar a consulta JPQL para utilizar a função customizada:

Captura de tela de 2017-11-15 14:46:58

E ao executar o método de testes teremos o seguinte resultado:

Captura de tela de 2017-11-15 14:48:24

 

É isto galera, fica a dica. Espero que seja útil.

 

[]’s

Anúncios