Juntamente com o poderoso container Hibernate, você tem ainda a HQL é um acrônimo para Hibernate Query Language, e como o próprio nome já sugere é uma linguagem para criação de Querys. Esta linguagem tem por principal objeto que o desenvolvedor se preocupe apenas com desenvolvimento, trabalhando apenas com Objetos, como se o próprio banco fosse orientado a objetos.

A idéia de mudar os Bancos relacionais para Bancos orientados à objetos é um sonho a muito tempo. Todos sabem que a proposta deste novo paradigma é com certeza muito mais atraente do que trabalhar com um banco de dados relacional. O grande problema de você raramente (muito raro mesmo) um projeto construído sobre um banco de dados relacional é a falta de recursos para o mesmo, isso porque nenhuma empresa em sã consciência gostaria de gastar uma quantia notável para migrar todo o seu banco de dados relacional para orientado a objetos, qual a vantagem nisso pra eles? Nenhuma.

A HQL tenta “criar” de certa forma essa camada que transforma o banco de dados relacional em orientado a objetos. Agora se você nunca trabalhou com orientação a objetos, com certeza achará um tanto quanto estranho.

Enfim, vamos focar neste artigo em exemplos básicos para entendimento do HQL, utilizando os DML (Data Manipulation Language), que são SELECT, INSERT, DELETE e UPDATE. Você perceberá que todos tem uma semelhança enorme com SQL, e caso você tenha conhecimento do mesmo, verá que não será nenhum pouco complicado aprender o HQL.

HQL - Exemplo com SELECT

Iniciando com o DML SELECT no HQL você substitui (na verdade esqueça o conceito de tabelas, pois o paradigma é outro) tudo que é tabelas para objetos, isso significa que se você tiver uma Classe Venda e outra ItemVenda é ela que você irá chamar no SELECT.

Listagem 1: SELECT


Query query = session.createQuery("from Venda where vendaid = :id ");
query.setParameter("id", "123");
List list = query.list();

Listagem 2: SELECT sem parâmetros


Query query = session.createQuery("from Venda where vendaid = ''''123'''' ");
List list = query.list();

Note que fazemos referencia direta ao objeto Venda e seu atributo vendaid. Se o atributo vendaid da Classe Venda tiver o nome id_venda na tabela venda, isso não nos importa agora. Se você já trabalhou com os mapeamentos do Hibernate (Sejam eles com JPA ou XML) entenderá facilmente que é lá que você diz que o atributo vendaid corresponde ao campo id_venda no banco de dados relacional.

É importante lembrar que nem precisamos colocar a palavra chave SELECT, isso porque o FROM já é auto-explicativo e para o HQL isso basta.

HQL - Exemplo com UPDATE

Vamos agora atualizar um registro utilizando HQL.

Listagem 3: UPDATE


Query query = session.createQuery("update Venda set numOcorrencia = :numero" +
    				" where vendaid = :id");
query.setParameter("numero", "0000000013");
query.setParameter("id", "123");
int result = query.executeUpdate();

Listagem 4: UPDATE sem parâmetros


Query query = session.createQuery("update Venda set numOcorrencia = ''''0000000013''''" +
    				" where vendaid = ''''123''''");
int result = query.executeUpdate();

HQL - Exemplo com DELETE

Com o fluxo dos exemplos você já deve ter percebido o funcionamento no HQL até este ponto, caso ainda não o tenha, iremos ainda dar exemplo com DELETE e INSERT para fixação.

Listagem 5: DELETE


Query query = session.createQuery("delete Venda where vendaid = :id");
query.setParameter("id", "123");
int result = query.executeUpdate();

Listagem 6: DELETE sem parâmetros


Query query = session.createQuery("delete Venda where vendaid = ''''123''''");
int result = query.executeUpdate();

Em algum ponto você até se questionar se isto de fato é HQL, pois a semelhança com SQL é enorme. Na verdade este é o ponto, não fugir muito do SQL e ao mesmo tempo mudar totalmente de paradigma, veja agora o quão poderoso pode ser o HQL, nem ao menos preciso saber o nome da tabela. Podemos deixar a cargo do DBA (Database Administrador) mudar o nome da tabela a hora que desejar e realizar as atualizações nos mapeamentos, e em nada isso influenciará o funcionamento da nossa aplicação.

Lembre-se da dor de cabeça que ocorria a tempos atrás quando no fim do projeto tínhamos escrito a tabela com um nome errado. Hoje com o Hibernate essa enorme dor de cabeça agora é só um pequeno “mal estar”.

HQL - Exemplo com INSERT

O INSERT tem uma peculiaridade que devemos atentar: O HQL apenas suporta o INSERT INTO, não existe INSERT INTO ... VALUES. Para que você pode inserir determinado registro, no local do antigo VALUES você deve usar um SELECT para capturar os dados que deseja inserir, vamos ver um exemplo melhor do seu funcionamento.

Listagem 7: INSERT


"insert into Venda (id, numeroOcorrencia) select vv.id, vv.numeroOcorrencia from Venda vv";

Vamos pegar dados da Venda de uma tabela backup e colocá-la na nova tabela, mas conhecido como bulk-insert.

Conclusão

Este artigo trouxe exemplos simples, porém que em muito irão acrescentar aqueles que estão iniciando da utilização do HQL. Como você pode ter notado esta é uma poderosa linguagem que traz diversos benefícios ao desenvolvimento de um projeto de grande escala.

Além disso, há muitos mais recursos que podem ser explorados, e que com certeza você irá achar estes mais poderosos ainda. Você por exemplo pode passar objetos inteiros para o HQL comparar, em vez de ficar passando ID, nome ou qualquer outro atributo para servir de filtro, você passa todo o Objeto e deixa o HQL tomar conta do resto.

Retorne listas inteiras de objetos prontas para serem trabalhadas em Java, crie novos objetos dentro do próprio HQL, crie MAP’s e mais uma infinidade de recursos. No final deste artigo, na seção links você encontrará a referência direta para este assunto no qual estamos tratando.

Links