O documento discute as linguagens HQL e Criteria para consultas no Hibernate, abordando: 1) HQL é baseada em SQL e suporta classes, enquanto Criteria é 100% Java; 2) Ambas permitem filtros, ordenação, junções e agregações; 3) Criteria é indicada quando as consultas são dinâmicas.
4.
Palavras chave
● Derivadas do SQL
● Não diferenciadas por maiúsculas/minúsculas (mas
as classes e atributos são !)
5.
Palavras chave: from
A query mais simples do HQL:
from <classe> [apelido]
retorna todas as instâncias daquela classe.
Ex:
from br.ita.finep.icammh.domain.ResultadoColeta
from br.ita.finep.icammh.domain.ResultadoColeta rc
6.
Palavras chave: select
Seleciona objetos e propriedades a serem
retornados no result set:
select <objetos.propriedades> from …
Ex:
select rc.id, rc.nomeArquivo
from
br.ita.finep.icammh.domain.ResultadoColeta rc
7.
Palavras chave: where
Acrescentra condições para filtragem do result set:
select … from … where <condição>
Ex:
select rc.id, rc.nomeArquivo
from
br.ita.finep.icammh.domain.ResultadoColeta rc
where rc.id>20
8.
Outras Palavras chave
● order by: ordenação do result set
● group by: agrupamento do result set
Ex:
select tamanho from
br.ita.finep.icammh.domain.CampoParametro
group by tamanho
9.
Junções Implícitas
● Objetos visíveis podem ser referenciados
diretamente.
Ex:
select rc.coleta.nome, rc.coleta.tipoColeta.nome
from
br.ita.finep.icammh.domain.ResultadoColeta rc
where rc.id < 200
10.
Junções Explícitas
● Use a palavra chave join para explicitar a junção e
definir apelidos
Ex:
select col.nome, col.tipoColeta.nome
from
br.ita.finep.icammh.domain.ResultadoColeta rc
join rc.coleta col
where rc.id < 200
12.
Expressões suportadas em
condições
● Operadores matemáticos: +, , *, /
● Comparadores lógicos: =, >=, <=, <>, !=, like, in,
not in, between, is null, is not null, is empty, is
not empty, member of and not member of
● Operações lógicas: and, or, not
● Parenteses indicando agrupamento: ( )
● Case: case ... when ... then ... else ... end
14.
Expressões suportadas em
condições
● Conversão de tipo: cast(... as ...), extract(... from ...)
● Parâmetros posicionais e nomeados: ?, :nomePar
● Operações em coleções: [any, some, all, exists]
elements(), indices(), size(), minelement(),
maxelement(), minindex(), maxindex(),
● Qualquer função suportada pelo SQL do BD
destino: sign(), trunc(), rtrim(), sin()
16.
Interface Query
● Regras de retorno no result set:
● Se não existe cláusula select
● Se a cláusula from referencia uma única classe, cada
linha do result set é uma instância dessa classe.
● Se a cláusula from referencia mais de uma classe, o
result set é composto por Object[] onde cada entrada
é uma instância de cada classe referenciada.
● Se existe a cláusula select
● Com um único elemento, cada linha do result set é
uma instância desse elemento.
● Com vários elementos, cada linha do result set é um
Object[] onde cada entrada é uma instância de cada
elemento.
17.
Retornando Instâncias de
VOs
● É possível criar instâncias de value objects
diretamente no HQL:
select new <ClasseVO>(...) from …
Ex:
select new
br.ita.finep.icammh.sad.common.PerfilVO(p.id,
p.nome)
from br.ita.finep.icammh.domain.Perfil p
18.
Outros retornos
● O result set pode ser um um list, usandose
“select new list(...)”
● O result set pode ser um map, usandose
“select new map(...)”
19.
Update & Delete
● Sintaxe semelhante ao SQL: ( update | delete)
[from] EntityName (where <condições>)
Ex:
delete br.ita.finep.icammh.domain.Coleta col
where col.id > 2000000
update br.ita.finep.icammh.domain.Coleta col set
col.nomeArquivo=:novoNomeArquivo where
col.id > 2000000
20.
Interface Query
● O HQL é executado a partir de uma instância de
org.hibernate.Query, obtida da instância do Session
Query query = session.createQuery("from Book");
List books = query.list();
…
Query query = session.createQuery("from Book");
Iterator itBooks = query.iterate();
...
Query query = session.createQuery("from Book where isbn=:isbn");
query.setString("isbn", "1932394419");
Book book = (Book) query.uniqueResult();
22.
Performance HQL
● Métodos que influenciam na performance:
...
query.setFirstResult(20);
...
query.setMaxResults(10);
...
query.setFetchSize(100);
● O método uniqueResult retorna o objeto único que a query
retorna, null se o result set é vazio, ou dispara a exceção
NonUniqueResultException caso o result set retorne
mais de uma instância.
23.
Queries nomeadas
● Podese colocar as queries dentro dos arquivos de
mapeamento (*.hbm.xml), atribuindo nomes.
Ex:
<hibernatemapping>
<query name="Book.by.isbn">
<![CDATA[from Book where isbn = ?]]>
</query>
</hibernatemapping>
…
Query query = session.getNamedQuery("Book.by.isbn");
query.setString(0, "1932394419");
Book book = (Book) query.uniqueResult();
24.
HQL & Andromda
● Para escrever queries HQL diretamente no modelo,
crie um método na <<Entity>> marqueo como
“Query” e escreva a query no valor etiquetado
@andromda.hibernate.query
● Os parâmetros do método devem ter o mesmo nome
dos parâmetros dentro da query.
● Podese retornar um Collection ou uma classe
específica, nesse caso o método uniqueResult() da
interface org.hibernate.Query é usado.
25.
Hibernate Criteria Queries
● Mecanismo de consultas 100% Java.
● Indicado para situações onde a query deve ser
criada dinamicamente.
● A sessão corrente retorna instâncias da Criteria
através do método createCriteria.
Ex:
Criteria criteria = session.createCriteria(Book.class)
List books = criteria.list();
Equivale a:
Query query=session.createQuery(“from Book”);
List books = query.list();
27.
Expressões Lógicas
● Podem ser expressas com Restrictions.and,
Restrictions.or ou Restrictions.conjunction e
Restrictions.disjunction.
Ex:
Criteria criteria=
session.createCriteria(
br.ita.finep.icammh.domain.Perfil.class);
Disjunction dj=Restrictions.disjunction();
dj.add(Restrictions.le("id",10L));
dj.add(Restrictions.ge("id",50L));
criteria.add(dj);
criteria.list();
32.
Criteria desacoplada da
sessão
● A classe org.hibernate.criterion.DetachedCriteria
permite a criação de consultas desacopladas da
sessão
Ex:
DetachedCriteria dc=DetachedCriteria.forClass(
br.ita.finep.icammh.domain.PerfilCampos.class);
dc.add(Restrictions.lt("id",10L));
dc.getExecutableCriteria(session).list();
34.
Criteria & Andromda
● Use o estereótipo <<Criteria>> para criar classes
que representem consultas na persistência
35.
Criteria & Andromda
● O cartucho Hibernate gera uma classe Search para
facilitar a criação de consultas no código Java, e
os DAOs gerados contém métodos para a
execução dessas consultas.
Ex:
38.
Hibernate & Jasper Reports
● O Jasper Reports suporta HQL de forma nativa
● O Jasper Reports pode receber um Collection de
beans como base de dados para o relatório,
portanto podese um passar o resultado da
execução de uma Criteria (ou de uma
<<Criteria>>)