Introdução ao HQL (Hibernate Query Language)

1.259 visualizações

Publicada em

Veja neste artigo os conceitos e usos básicos do HQL, para que você possa começar a utilizar essa poderosa linguagem.

Publicada em: Tecnologia
0 comentários
1 gostou
Estatísticas
Notas
  • Seja o primeiro a comentar

Sem downloads
Visualizações
Visualizações totais
1.259
No SlideShare
0
A partir de incorporações
0
Número de incorporações
1
Ações
Compartilhamentos
0
Downloads
17
Comentários
0
Gostaram
1
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

Introdução ao HQL (Hibernate Query Language)

  1. 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() {
  2. 2. return id; } public void setId(Integer id) { this.id = id; } public String getNome() { returnnome; } public void setNome(String nome) { this.nome = nome; } publicEnderecoPessoagetEnderecoAtual() { returnenderecoAtual; } publicvoidsetEnderecoAtual(EnderecoPessoaenderecoAtual) { this.enderecoAtual = enderecoAtual; } public Telefone getTelefoneAtual() { returntelefoneAtual; } publicvoidsetTelefoneAtual(Telefone telefoneAtual) { this.telefoneAtual = telefoneAtual; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } } // Fim Pessoa Agora vamos criar nosso BeanEnderecoPessoa.
  3. 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. 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. 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.

×