1. Com a evolução do Hibernate, surge também a necessidade de trabalhar-se com banco de dados orientado a
objetos. Mas infelizmente isso não é uma realidade atual, isso porque o custo para migrar todos os bancos de
dados relacionais para orientado a objetos é grande, e como não irá mudar “nada” para o usuário final, então o
mesmo prefere não trocar.
Enfim, a solução para trabalhar com o nível de abstração orientado a objetos, mesmo estando em um banco de
dados relacional, é o HQL (Hibernate Query Language).
O HQL oferece ao desenvolvedor todo recurso necessário para trabalhar com um nível de abstração tão alto que
fica quase transparente a manipulação com um banco de dados relacional, isso porque o HQL é um “SQL com
capa”, ou seja, ao realizar a busca através de um Bean do Java, automaticamente o HQL é transformado em
um SQL equivalente, de forma transparente ao desenvolvedor.
Usando HQL
Antes de começar, é importante que você tenha em mente que é necessário ter todo mapeamento do
hibernate.cfg.xml pronto, pois o HQL faz consulta a ele para transformar sua Classe em Tabela.
Ao usar HQL esqueça o nome das suas colunas, tabelas e tipos no banco. Lembre-se apenas como está a sua
Classe, pois é ela que nos importa. Vamos então supor a classe Pessoa abaixo.
Listagem 1: Classe Pessoa
publicclass Pessoa {
//---------------------
//Atributos de instância
//---------------------
privateInteger id;
privateString nome;
privateEnderecoPessoaenderecoAtual;
privateStringemail;
//-------------
//Construtores
//-------------
public Pessoa() {
}
public Pessoa(Integer id) {
this.id = (Integer) id;
}
public Pessoa(Integer id, String nome) {
this.id = (Integer) id;
this.nome = nome;
}
public Integer getId() {
3. Listagem 2: Classe EnderecoPessoa
importbr.com.socic.util.Formatador;
publicclassEnderecoPessoa{
//-----------------------
//Atributos de instância
//-----------------------
private Integer id;
private String complemento;
private String entreRua1;
private String entreRua2;
private String numero;
private String pontoReferencia;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getComplemento() {
returncomplemento;
}
public void setComplemento(String complemento) {
this.complemento = complemento;
}
public String getEntreRua1() {
return entreRua1;
}
public void setEntreRua1(String entreRua1) {
this.entreRua1 = entreRua1;
}
public String getEntreRua2() {
return entreRua2;
}
public void setEntreRua2(String entreRua2) {
this.entreRua2 = entreRua2;
}
public String getNumero() {
return numero;
}
4. public void setNumero(String numero) {
this.numero = numero;
}
publicStringgetPontoReferencia() {
returnpontoReferencia;
}
publicvoidsetPontoReferencia(StringpontoReferencia) {
this.pontoReferencia = pontoReferencia;
}
} // fim Endereco
Não vamos nos atentar ao mapeamento de ambas as classes, pois isso demandaria muito tempo e espaço do
artigo, vamos focar em trabalhar com HQL usando essas duas classes.
Listagem 3: HQL Simples da Classe Pessoa
SELECT pessoa FROM Pessoa pessoa
Vamos ao nosso primeiro HQL, na listagem 3 você percebe que referenciamos apenas a classe Pessoa, fizemos
um cast para “pessoa” e estamos retornando todas as pessoas do banco. Porém, ao realizar isso estamos
retornando apenas os atributos comuns, sem objetos, ou seja, não conseguiremos dessa forma capturar o
número do endereço da pessoa.
O SELECT acima retorna o objeto pessoa como “lazy”, ou seja, sem carregar seus “sub-objetos”, que é o caso
do objeto enderecoPessoa. Para carregar os objetos precisamos explicitamente utilizar a palavra reservada
“JOIN FETCH”, como na listagem 4.
Listagem 4: Carregando Pessoa com EnderecoPessoa
SELECT pessoa FROM Pessoa pessoa
JOIN FETCH pessoa.enderecoPessoa
O HQL tem uma sintaxe muito parecida com SQL, por isso seu aprendizado é rápido e simples para quem já é
familiarizado com SQL. Ainda se tratando da listagem 4, pode ocorrer que nem toda pessoa tem um endereço,
neste caso devemos usar a palavra “LEFT” antes do JOIN, assim estamos dizendo algo como: “Carregue todas
as pessoas com os seus endereços, mesmo que elas não tenham endereço.” Se você retira o “LEFT” a nossa
analogia ficaria mais ou menos assim: “Carregue todas as pessoas com os seus endereços, sendo que todas
devem obrigatoriamente ter endereço, caso contrário ignore-a”.
Podemos ir mais a fundo, buscar um atributo de enderecoPessoa usando o objeto pessoa e ainda realizar um
WHERE.
Listagem 5: Buscando atributo de EnderecoPessoa
SELECT pessoa FROM Pessoa pessoa
JOIN FETCH pessoa.enderecoPessoaendereco
WHERE endereco.numero = :numeroDoEndereco
O que fizemos acima foi realizar um cast de “pessoa.enderecoPessoa” para “endereco”, assim não precisamos
ficar usando toda hora o nome completo (pessoa.enderecoPessoa), usamos apenas a palavra “endereco”.
Depois estamos fazendo um filtro, para buscar apenas as pessoas que moram em determinado número. O
código “:numeroDoEndereco” é exatamente um parâmetro que você irá passar ao HQL para procurar pelo
número que desejar.
5. CONCLUSÃO
Este artigo apresentou conceitos básicos para quem desejar iniciar a desenvolver com HQL, a partir daqui é
recomendável uma leitura mais aprofundada sobre o assunto, caso tenha interesse. O HQL é uma poderosa
linguagem que possui inúmeros recursos e métodos que são utilizados no próprio Java.