SlideShare une entreprise Scribd logo
1  sur  5
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() {
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.
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;
}
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.
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.

Contenu connexe

En vedette

Literatura infantil no meio digital
Literatura infantil no meio digitalLiteratura infantil no meio digital
Literatura infantil no meio digitalHumberto Neves
 
Encontrar e partilhar livros no iTunes
Encontrar e partilhar livros no iTunesEncontrar e partilhar livros no iTunes
Encontrar e partilhar livros no iTunesJosé Fernando Tavares
 
Introdução a programação para plataforma iOS
Introdução a programação para plataforma iOSIntrodução a programação para plataforma iOS
Introdução a programação para plataforma iOSDevmedia
 
making a book app, a collaborative approach
making a book app, a collaborative approachmaking a book app, a collaborative approach
making a book app, a collaborative approachHumberto Neves
 
Maturidade no desenvolvimento de software: CMMI e MPS-BR
Maturidade no desenvolvimento de software: CMMI e MPS-BR Maturidade no desenvolvimento de software: CMMI e MPS-BR
Maturidade no desenvolvimento de software: CMMI e MPS-BR Devmedia
 
Livros eletrônicos interativos com html5 e e pub3
Livros eletrônicos interativos com html5 e e pub3Livros eletrônicos interativos com html5 e e pub3
Livros eletrônicos interativos com html5 e e pub3Intel Software Brasil
 
pequenos toques grandes aprendizagens
pequenos toques grandes aprendizagenspequenos toques grandes aprendizagens
pequenos toques grandes aprendizagensHumberto Neves
 
Como fazer um livro interactivo digital
Como fazer um livro interactivo digitalComo fazer um livro interactivo digital
Como fazer um livro interactivo digitalHumberto Neves
 
UPU 2015 Get Discovered By the Right Readers--Keywords
UPU 2015 Get Discovered By the Right Readers--KeywordsUPU 2015 Get Discovered By the Right Readers--Keywords
UPU 2015 Get Discovered By the Right Readers--KeywordsBowker
 
Desenvolvimento Apps multiplataforma para dispositivos móveis usando HTML5
Desenvolvimento Apps multiplataforma para dispositivos móveis usando HTML5Desenvolvimento Apps multiplataforma para dispositivos móveis usando HTML5
Desenvolvimento Apps multiplataforma para dispositivos móveis usando HTML5Intel Software Brasil
 
Publicações Digitais | eBooks e Tablets
Publicações Digitais | eBooks e TabletsPublicações Digitais | eBooks e Tablets
Publicações Digitais | eBooks e Tabletsdualpixel
 
Utfprfazpesquisa claudia bordinrodrigues_nov2016
Utfprfazpesquisa claudia bordinrodrigues_nov2016Utfprfazpesquisa claudia bordinrodrigues_nov2016
Utfprfazpesquisa claudia bordinrodrigues_nov2016profclaubordin
 
TecDig - Iniciando o Photoshop
TecDig - Iniciando o PhotoshopTecDig - Iniciando o Photoshop
TecDig - Iniciando o Photoshopprofclaubordin
 

En vedette (14)

Literatura infantil no meio digital
Literatura infantil no meio digitalLiteratura infantil no meio digital
Literatura infantil no meio digital
 
Encontrar e partilhar livros no iTunes
Encontrar e partilhar livros no iTunesEncontrar e partilhar livros no iTunes
Encontrar e partilhar livros no iTunes
 
Introdução a programação para plataforma iOS
Introdução a programação para plataforma iOSIntrodução a programação para plataforma iOS
Introdução a programação para plataforma iOS
 
making a book app, a collaborative approach
making a book app, a collaborative approachmaking a book app, a collaborative approach
making a book app, a collaborative approach
 
Maturidade no desenvolvimento de software: CMMI e MPS-BR
Maturidade no desenvolvimento de software: CMMI e MPS-BR Maturidade no desenvolvimento de software: CMMI e MPS-BR
Maturidade no desenvolvimento de software: CMMI e MPS-BR
 
Livros eletrônicos interativos com html5 e e pub3
Livros eletrônicos interativos com html5 e e pub3Livros eletrônicos interativos com html5 e e pub3
Livros eletrônicos interativos com html5 e e pub3
 
pequenos toques grandes aprendizagens
pequenos toques grandes aprendizagenspequenos toques grandes aprendizagens
pequenos toques grandes aprendizagens
 
Como fazer um livro interactivo digital
Como fazer um livro interactivo digitalComo fazer um livro interactivo digital
Como fazer um livro interactivo digital
 
UPU 2015 Get Discovered By the Right Readers--Keywords
UPU 2015 Get Discovered By the Right Readers--KeywordsUPU 2015 Get Discovered By the Right Readers--Keywords
UPU 2015 Get Discovered By the Right Readers--Keywords
 
ePub3 e Html5
ePub3 e Html5ePub3 e Html5
ePub3 e Html5
 
Desenvolvimento Apps multiplataforma para dispositivos móveis usando HTML5
Desenvolvimento Apps multiplataforma para dispositivos móveis usando HTML5Desenvolvimento Apps multiplataforma para dispositivos móveis usando HTML5
Desenvolvimento Apps multiplataforma para dispositivos móveis usando HTML5
 
Publicações Digitais | eBooks e Tablets
Publicações Digitais | eBooks e TabletsPublicações Digitais | eBooks e Tablets
Publicações Digitais | eBooks e Tablets
 
Utfprfazpesquisa claudia bordinrodrigues_nov2016
Utfprfazpesquisa claudia bordinrodrigues_nov2016Utfprfazpesquisa claudia bordinrodrigues_nov2016
Utfprfazpesquisa claudia bordinrodrigues_nov2016
 
TecDig - Iniciando o Photoshop
TecDig - Iniciando o PhotoshopTecDig - Iniciando o Photoshop
TecDig - Iniciando o Photoshop
 

Plus de Devmedia

Introdução ao IBM Data Studio
Introdução ao IBM Data StudioIntrodução ao IBM Data Studio
Introdução ao IBM Data StudioDevmedia
 
Windows Phone: Verificando a conexão com a internet
Windows Phone: Verificando a conexão com a internetWindows Phone: Verificando a conexão com a internet
Windows Phone: Verificando a conexão com a internetDevmedia
 
Verificando a conexão com a internet no Windows Phone
Verificando a conexão com a internet no Windows PhoneVerificando a conexão com a internet no Windows Phone
Verificando a conexão com a internet no Windows PhoneDevmedia
 
A Classe StringBuilder em Java
A Classe StringBuilder em JavaA Classe StringBuilder em Java
A Classe StringBuilder em JavaDevmedia
 
Customizando validator em grails
Customizando validator em grailsCustomizando validator em grails
Customizando validator em grailsDevmedia
 
Criando e alterando login - permissões no SQL Server 2008 R2
Criando e alterando login - permissões no SQL Server 2008 R2Criando e alterando login - permissões no SQL Server 2008 R2
Criando e alterando login - permissões no SQL Server 2008 R2Devmedia
 

Plus de Devmedia (6)

Introdução ao IBM Data Studio
Introdução ao IBM Data StudioIntrodução ao IBM Data Studio
Introdução ao IBM Data Studio
 
Windows Phone: Verificando a conexão com a internet
Windows Phone: Verificando a conexão com a internetWindows Phone: Verificando a conexão com a internet
Windows Phone: Verificando a conexão com a internet
 
Verificando a conexão com a internet no Windows Phone
Verificando a conexão com a internet no Windows PhoneVerificando a conexão com a internet no Windows Phone
Verificando a conexão com a internet no Windows Phone
 
A Classe StringBuilder em Java
A Classe StringBuilder em JavaA Classe StringBuilder em Java
A Classe StringBuilder em Java
 
Customizando validator em grails
Customizando validator em grailsCustomizando validator em grails
Customizando validator em grails
 
Criando e alterando login - permissões no SQL Server 2008 R2
Criando e alterando login - permissões no SQL Server 2008 R2Criando e alterando login - permissões no SQL Server 2008 R2
Criando e alterando login - permissões no SQL Server 2008 R2
 

Introdução ao HQL (Hibernate Query Language)

  • 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. 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. 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.