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


public class Pessoa {	
	
	//---------------------
	//Atributos de instância
	//---------------------
    private Integer id; 
    private String nome; 
    private EnderecoPessoa enderecoAtual;
    private String email;
    
    //-------------
    //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() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public EnderecoPessoa getEnderecoAtual() {
		return enderecoAtual;
	}

	public void setEnderecoAtual(EnderecoPessoa enderecoAtual) {
		this.enderecoAtual = enderecoAtual;
	}

	public Telefone getTelefoneAtual() {
		return telefoneAtual;
	}

	public void setTelefoneAtual(Telefone telefoneAtual) {
		this.telefoneAtual = telefoneAtual;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}
    
    
    
} // Fim Pessoa

Agora vamos criar nosso Bean EnderecoPessoa.

Listagem 2: Classe EnderecoPessoa



import br.com.socic.util.Formatador;

public class EnderecoPessoa{
    
	//-----------------------
	//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() {
		return complemento;
	}
	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;
	}
	public void setNumero(String numero) {
		this.numero = numero;
	}
	public String getPontoReferencia() {
		return pontoReferencia;
	}
	public void setPontoReferencia(String pontoReferencia) {
		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.enderecoPessoa endereco
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.

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.