Professional Documents
Culture Documents
Formas de consultas
Hibernate Query Language (HQL), e um subconjunto do padro JPA QL (Java Persistence API Query Language :
session.createQuery("from Category c where c.name like 'Laptop%'"); entityManager.createQuery("select c from Category c where c.name like 'Laptop%' );
Criteria API para consulta por critrio (QBC) e consulta por exemplo (QBE):
session.createCriteria(Category.class).add( Restrictions.like("name", "Laptop%") );
Utiliza Criteria
Query consulta = session .createQuery(" from Estado order by sigla asc").setMaxResults(10); Criteria crit = session.createCriteria(Estado.class) .addOrder(Order.desc("sigla")) .setFirstResult(5) .setMaxResults(6); List relEstados = crit.list();
6
HQL
Hibernate equipado com uma linguagem de consulta extremamente poderosa que (intencionalmente) muito parecida com SQL. HQL completamente orientado a objetos, entendendo noes como herana, polifomorfismo e associao. Consultas so case-insensitive (no sensveis letra), com exceo de nomes para as classes e propriedades Java. Assim SeleCT tem o mesmo significado que sELEct e SELECT mas org.hibernate.eg.FOO no igual a org.hibernate.eg.Foo e foo.barSet no igual a not foo.BARSET.
Clusula FROM
A mais simples consulta Hibernate : from eg.Cat Que retorna todas as instncias da classe Cat. No necessrio qualificar o nome da classe, desde que a auto importao o padro. Assim geralmente escreve-se: from Cat Muitas vezes, necessrio atribuir uma alias, desde que deseja-se referir ao Cat em outras partes da consulta. from Cat as cat
10
11
Associaes e Junes
Pode-se tambm associar aliases para entidades associadas ou tambm para elementos de uma coleo de valores utilizando JOIN. from Cat as cat inner join cat.mate as mate left outer join cat.kittens as kitten from Cat as cat left join cat.mate.kittens as kittens from Formula form full join form.parameter param
12
Associaes e Junes
Os tipos de junes (joins) suportados so emprestados do SQL ANSI:
inner join left outer join right outer join full join
As construes inner join, left outer join e right outer join podem ser abreviadas. from Cat as cat join cat.mate as mate left join cat.kittens as kitten
13
Fetching strategies
Em um acesso tradicional aos dados, pode-se pegar todos dos dados requeridos para um processo em particular para uma consulta SQL simples, contando com a vantagem de junes internas ou externas (inner or outer joins) para recuperar as entidades relacionadas. Algumas primitivas implementadas no modelo ORM (object/relational mapping) para pegar "pedaos" de dados com inmeras requisies para pequenos pedaos de dados em resposta das aplicaes navegando um grafo de objetos persistentes, no uma forma eficiente de utilizao das capacidades de juno (join) do banco de dados.
14
Esta estratgia de acesso a dados pobre por natureza. Uma das maiores dificuldades em ORM prover um acesso eficiente para os dados relacionais, dando uma aplicao que prefere tratar os dados como um objeto de grafo. Para os tipos mais comuns de aplicaes (multiusurio, distribudo, web e aplicaes coorporativas), a recuperao de objetos utilizando muitos acessos ao banco de dados no aceitvel. Ser discutido que as ferramentas devem enfatizar o R em ORM para a extenso maior que a tradicional.
15
O problema de pegar objetos de grafos eficientemente, com acesso mnimo para o banco de dados, tem freqentemente associando com o provimento ao nvel de associao da estratgia de capturar um meta dados especfico do mapeamento de associao. O problema com esta soluo que cada pedao do cdigo que utiliza um requisito de entidade um conjunto diferente de objetos associados. Mas isto no suficiente. necessrio um suporte para refino da estratgia de execuo da associao de captura. Hibernate suporta as duas estratgias, que permite especificar uma estratgia padro de captura no arquivo de mapeamento e ento sobre escrever em tempo de execuo no cdigo.
16
Hibernate permite escolher entre quarto estratgia de captura para qualquer associao, nos metadados de associao e em tempo de execuo: Immediate fetching - Captura Imediata
O objeto associado capturado imediatamente, utilizando uma leitura em banco de dados seqencial (cache).
18
19
21
23
Batch fetching
Carga em lote no estritamente uma estratgia de carga associada; uma tcnica que pode ajudar a melhorar a performance da carga preguiosa ou carga imediata. Geralmente, quando se carrega um objeto ou uma coleo, a clusula WHERE do SQL especifica o identificador do objeto ou os objetos que possuem a coleo. Se a carga em lote estiver habilitada, Hibernate procura ver o que outras instncias de proxie ou colees no inicializadas so referenciadas na seo corrente e tenta carrega-los ao mesmo tempo especificando mltiplos valores identificadores na clsula WHERE.
24
Carga urgente geralmente mais rpida. Carga em batch mais fcila para os usurios inexperientes que desejam arquivar com uma performance aceitvel com Hibernate sem ter que pensar muito sobre o que SQL executar.
25
Uma juno "fetch" permite associaes ou colees de valores serem inicializadas por seus objetos pai, utilizando uma seleo simples. til particularmente em caso de uma coleo (collection). eficiente para sobre escrever um outer join e lazy declarations do arquivo de mapeamento para associaes e colees. from Cat as cat inner join fetch cat.mate left join fetch cat.kittens
27
Um fetch join geralmente no necessita atribuir um alias, por que os objetos associados no deve ser utilizado na clusula where ou qualquer outra clusula. Objetos associados no retornam diretamente em resultados de uma consulta. Por outro lado, podem ser acessados por objetos pai. A nica razo que se necessita um alias se existir um join fetching recursivo para uma coleo futura.
28
from Cat as cat inner join fetch cat.mate left join fetch cat.kittens child left join fetch child.kittens Prestar ateno que uma construo com fetch no deve ser utilizado com consultas chamadas utilizando scroll() ou iterate(). Nem o fetch pode ser utilizado junto com setMaxResults() ou setFirstResult().
29
Produto Cartesiano
possvel criar um produto cartesiano juntando mais de uma coleo de em uma consulta, assim deve-se tomar cuidado neste caso.
Juntando mltiplas colees pode resultar em resultados inesperados de um mapeamento mal feito.
Se utilizar a propriedade lazy fetching com a instrumentalizao bytecode, possvel forar o Hibernate a percorrer a propriedade lazy imediatamente na primeira consulta utilizando todas as propriedades de navegao.
from Document fetch all properties order by name from Document doc fetch all properties where lower(doc.name) like '%cats%'
30