Sie sind auf Seite 1von 33

Criando e executando consultas

Formas de criar consultas

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%") );

SQL direto com ou sem mapeamento automtico do resultsets para objeto.


session.createSQLQuery( "select {c.*} from CATEGORY {c} where NAME like 'Laptop%'").addEntity("c", Category.class);

Preparando uma consulta


As interfaces org.hibernate.Query e org.hibernate.Criteria possuem inmeros mtodos para controlar a execuo de uma consulta. Query prov mtodos para atribuir valores para parmetros de consulta. Para executar uma consulta em uma aplicao necessrio obter uma instncia de uma destas interfaces utilizando a Session. Query hqlQuery = session.createQuery("from Event");

Associao <one-to-many>
Uma associao <um-para-muitos> liga as tabelas de duas classes atravs de uma chave estrangeira sem intervenso nas tabelas. Este mapeamento perde certa semntica para uma coleo normal Java:
Uma instncia que contem uma classe entidade no pode pertencer a mais de uma instncia de coleo. Uma instncia que contem uma classe entidade no pode aparecer em mais de um valor de um ndice de coleo.

Uma associao de Estados e Municpios requer a existncia de uma coluna de chave estrangeira e a possibilidade de uma coluna ndice para a tabela Municpios.
4

<one-to-many class="ClassName" not-found="ignore|exception" entity-name="EntityName" node="element-name" embed-xml="true|false" />

class (obrigatrio): O nome da classe associada not-found (opcional): Especifica como colocar em cache identificadores que referenciam as linhas inexistentes devem ser manipuladas. ignore tratar uma linha inexistente como uma associao nula. entity-name (opcional): O nome da entidade classe associada, como uma classe alternativa.
5

Exemplo
<hibernate-mapping> <class name="exemploestadolista.Estado" table="Estados"> <id name="ibge" column="IBGE"> </id> <property name="sigla"/> <property name="nome"/> <property name="area"/> <set name="municipios" table="municipios"> <key column="uf"/> <one-to-many class="exemploestadolista.Municipio" /> </set> </class> </hibernate-mapping>

Limitando a quantidade de respostas


Query consulta = session.createQuery("from Estado order by sigla asc"); consulta.setMaxResults(10);

Apresenta um conjunto com 10 elementos

Utiliza SQL e limitador


Query consulta = session.createSQLQuery("select {e.*} from estados {e} order by {e.sigla}"). addEntity("e",Estado.class); consulta.setFirstResult(5); consulta.setMaxResults(10); Utiliza expresso SQL. Inicia o resultado no quinto elemento e apresenta 10 registros.
8

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();
9

Consulta com parmetro


String consultaString = "from Estado uf where uf.sigla = :pesquisa"; String ufString = "PR"; Query consulta = session.createQuery(consultaString).setString ("pesquisa", ufString);

10

HQL Hibernate Query Language


Caio Nakashima caionakashima@gmail.com caio.nakashima@mds.gov.br

11

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.

12

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
13

Clusula FROM (2)


Esta consulta atribui para a instncia Cat um alias cat, assim pode-se utiliza-lo em outras partes da expresso de consulta. A palavra chave AS opcional, assim pode-se escrever tambm: from Cat cat Pode-se utilizar mltiplas classes, resultando um produto cartesiano ou um "cross" join. from Formula, Parameter from Formula as form, Parameter as param considerado uma boa prtica nomear alias de consulta utilizando a primeira letra em minscula, sendo consistente com o padro Java para nomear variveis locais.

14

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
15

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
16

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

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

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

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

Lazy fetching - Captura preguiosa


O objeto associado ou coleo capturado de "forma preguiosa", quando acessado. Resultada uma nova requisio para o banco de dados (a no ser que o objeto associado esteja no cache).
20

Eager fetching - Captura urgente


Um objeto associado ou coleo capturado junto com o objeto proprietrio, utilizando um outer join SQL, e nenhum outra requisio ao banco de dados requerida.

Batch fetching - Captura em Lote


Esta abordagem pode ser utilizada para melhorar a performance da captura "preguiosa" recuperando objetos ou colees em lote, quando uma uma associao "preguiosa" acessada. Captura em lote pode ser utilizado para melhorar a performance da captura imediata.

21

Immediate fetching (captura imediata)


Captura associativa imediata ocorre para recuperar uma entidade do banco de dados e ento recuperar imediatamente outra entidade associada ou entidades em uma requisio futura do banco de dados ou do cache. Captura imediata no uma estratgia captura eficiente a no ser que espere que as entidades associadas estejam quase sempre no cache.

22

Lazy fetching (captura preguiosa)


Quando um cliente requisita uma entidade e seu grafo de objetos associdado do banco de dados, no usualmente necessrio recuperar todo o grafo de todos os objetos associados (indiretamente). No se deseja carregar todo o banco de dados para a memria de uma vez, por exemplo, carregar um Pedido simples, no deve disparar uma carga de todos os itens do pedido. Lazy fetching permite ao programador decidir quantos grafos de objetos sero carregados no primeiro acesso ao banco de dados e quais associaes devem ser carregadas somente quando forem acessadas pela primeira vez.
23

Lazy fetching (cont.)


Lazy fetching um conceito fundamental em persistncia de objetos e o primeiro passo para obter uma performance aceitvel. Recomenda-se que, para comear com todas as associaes sejam configurados para lazy ou talvez para batched lazy carregamento no arquivo de mapeamento. Esta estratgia pode ser carregada (definida) em tempo de execuo por consultas que foram uma carga urgente.

24

Eager (outer join) fetching


Carga associada preguiosa pode ajudar a reduzir a carga no banco de dados e geralmente uma boa estratgia padro. Porm, algo parecido como um "chute no escuro" assim como uma otimizao de performance. Carga urgente permite explicitamente especificar qual objeto associado deve ser carregado junto com o objeto referenciado. Hibernate pode ento retornar o objeto associado em uma requisio simples no banco de dados, utilizando um SQL OUTER JOIN.
25

Eager (outer join) fetching


Otimizao de performance no Hibernate geralmente envolve um uso discreto da carga urgente para uma transao em particular. Desta forma, mesmo que padro a carga urgente pode ser declarada no arquivo de mapeamento, mais comum para uma utilizao especfica desta estratgia em tempo de execuo para uma HQL particular ou critrio de consulta.

26

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.

27

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.

28

Selecionando uma estratgia de carga no mapeamento


Hibernate permite selecionar associao padro para estratgia de carga especificando atributos nos metadados de mapeamento. Pode-se carregar uma estratgia padro utilizando caractersticas de consulta do Hibernate. A wrinkle in Hibernates mapping format means that collection mappings function slightly differently than single-point associations; so, well cover the two cases separately. Lets first consider both ends of the bidirectional association between Bid and Item.
29

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
30

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.

31

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().

32

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%'
33

Das könnte Ihnen auch gefallen