1. Programação Orientada a Objetos
Hibernate
(Consultas)
Objetivo: Recuperar dados de bancos de
dados usando o framework Hibernate
Prof. Nécio de Lima Veras
2. Introdução
• Existem três maneiras de se realizar
consultas usando o hibernate:
– HQL (Hibernate Query Language);
– Critéria (consultas usando os próprios objetos);
– SQL (consultas com SQL nativo);
3. HQL
• SQL orientado a objetos com:
– Classes e propriedades ao invés de Tabelas e colunas;
– Polimorfismo;
– Associações;
• Oferece Total suporte a operações relacionais, tais como:
– Joins;
– Projeções;
– Funções agregadas e agrupamento;
– Ordenação;
– SubQueries;
– Chamadas a funções SQL;
4. Exemplos
• Beeeeeeeem simples:
– “Devolva todos os “alunos”:
List alunos = session.createQuery(“from
Aluno”).list();
• Com paginação:
Query query = session.createQuery(“from
Aluno”);
query.setFirstResult(20);
query.setMaxResults(30);
List filmes = query.list();
5. Exemplos
• Com ordenação:
List locacoes =
session.createQuery(“from Locacao l
order by l.dataLocacao desc”);
• Com apenas um resultado:
Query query =
session.createQuery(“from Locacao l
order by l.dataLocacao desc”);
Locacao loc = query.uniqueResult();
6. Com parâmetros
• Usando between:
– createQuery(“from Especializacao where id
between :CodInicial and :CodFinal”);
7. Com paramêtros (variação)
List <Cliente> clientes =
session.createQuery("from CLiente where
vNome like ?").setString(0, "%").list();
for (Cliente c: clientes){
JOptionPane.showMessageDialog(null,
c.getNome());
}
Note que agora não especificamos o
identificador do parâmetro;
8. Com Joins
• Exemplo:
– “Busque todos os clientes com suas locações
efetuadas após uma determinada Data”;
select c from Cliente c left join [fetch] c.locacaoes
l where l.dataLocacao > :Data
• Entendendo a estratégia de fetching:
– Com o fetch: Coleções já inicializadas;
– Sem o fetch: lazy collections;
9. Com função agregada
• Função max:
int maxCod = (Integer)
session.createQuery("select max(id) from
Cliente").uniqueResult();
JOptionPane.showMessageDialog(null,
"Código máximo armazenado: " +
maxCod);
10. Mais sobre o HQL
• HQL suporta os mesmos operadores da
linguagem SQL;
• Operadores do HQL:
– Comparação: =, <>, <, >, >=, <=, between, not
between, in, not in;
– Nulidade: is null, is not null;
– Aritméticos: +, -, /, *, %, parênteses;
– O operador like funciona da mesma forma que
SQL;
– Pode usar funções SQL se o banco suportar;
11. Consultas “nomeadas”
• Podemos nomear uma consulta;
• Exemplo:
@NamedQuery (name="getAllClients", query="from Cliente")
public class Cliente extends Pessoa {…}
– Na classe que chama a consulta:
Dao<Cliente> dao = new Dao<Cliente>();
Session session = dao.getSession();
List <Cliente> clientes =
session.getNamedQuery("getAllClients").list();
for (Cliente c: clientes){
JOptionPane.showMessageDialog(null, c.getNome());
}
...
12. Criteria API
• Ideal para quem NÃO conhece linguagens
de consulta;
• Exemplo 1:
Criteria cCliente =
session.createCriteria(Cliente.class);
cCliente.add(Restrictions.like("nome", "%"));
List <Cliente> clientes = cCliente.list();
for (Cliente c: clientes){
JOptionPane.showMessageDialog(null, c.getNome());
}
13. Criteria API
• Exemplo 2 (cláusula where):
Criteria cCliente =
session.createCriteria(Cliente.class);
cCliente.add(Restrictions.sqlRestriction("vNom
e = 'Nécio'"));
List <Cliente> clientes = cCliente.list();
for (Cliente c: clientes){
JOptionPane.showMessageDialog(null, c.getNome());
}
15. Boas Práticas
• Uso de DAOs (Generic DAOs);
• Patterns (padrões);
– Session-per-request;
• Uma sessão é aberta no inicio de uma requisição e
fechada ao final;
• Cuidado com os Anti-patters;
– Session-per-operation
• Uma sessão é aberta para cada operação
executada;
16. Exercício
• A figura a seguir, mostra a estrutura de um
banco de dados que está povoado;
• Modele-o (idêntico à figura – inclusive os
nomes dos campos e tabelas e
principalmente com as devidas letras
maiúsculas e minúsculas) e faça as
consultas pedidas no slide seguinte;
18. Consultas
1. Mostre todos os estados cadastrados na tabela estado.
2. Mostre a cidade cidade cujo código seja: 5658.
3. Mostre agora TODAS as cidades do Ceará;
4. Ordene a questão anterior pela descrição (ordem alfabética).
5. Ainda na tabela cidade, mostre as cidades que contenham a palavra
Piauí na descrição.
6. Mostre o(s) bairro(s) da cidade de Buriti dos Lopes-PI.
7. Mostre a descrição e abreviatura dos bairros cujo CEP é 62300000.
8. Selecione todos os CEP’s das cidades do estado do PI.
9. Mostre os logradouros cujo CEP inicial com 642 e terminam com 220
(com as respectivas descrições das cidades e estados);
10. Conte quantas cidades existem no estado do Piauí;
11. Mostre o último logradouro inserido no banco de dados.
12. Mostre a quantidade de bairro do estado do Ceará.
19. Referências
• Material sobre Hibernate LES/PUC-Rio;
• Jobson Ronan {jrjs@cin.ufpe.br}
• Guilherme Kelly {gkmo@cin.ufpe.br}
• Ely Júnior (ely_b_jr@hotmail.com)