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

KeyError: ‘SQLALCHEMY_TRACK_MODIFICATIONS’

Olá pessoal!

Esta é uma dica rápida para quem usa Python, mais especificamente para quem desenvolve projetos com o Flask.

Se ao executar um projeto você obtiver o erro abaixo ao solicitar seus dados…

KeyError: 'SQLALCHEMY_TRACK_MODIFICATIONS'

… o problema pode ser a versão da dependência Flask-SQLAlchemy. Tive este problema com a versão 2.3.2 desta dependência, e resolvi fazendo um downgrade para a versão 2.1.

A primeira coisa a fazer é verificar a versão da dependência Flask-SQLAlchemy:

$ pip show Flask-SQLAlchemy

Se sua versão for a 2.3.2, faça a desinstalação da mesma (em alguns casos pode ser necessário utilizar o sudo):

$ pip uninstall Flask-SQLAlchemy

Instale então a versão 2.1 (em alguns casos pode ser necessário utilizar o sudo):

$ pip install Flask-SQLAlchemy==2.1

Verifique novamente a versão instalada:

$ pip show Flask-SQLAlchemy

Depois disso tente executar novamente seus serviços.

Fica a dica!