Anda di halaman 1dari 7

Tpicos Avanados de Programao - Ano:2011

Prof.Fbio Rener

Interface Query (Consultas Dinmicas e Consultas Nomeadas).


Para trabalhar com consultas vamos ver a utilizao da JPA Query API, na verso JPA 1 existia apenas a interface Query, agora na verso JPA 2 foi introduzida outra interface TypedQuery<T>. Usamos a interface Query quando no conhecemos o tipo de retorno da consulta, quando sabemos o retorno que teremos a interface mais indicada seria TypedQuery. Consultas Dinmicas. Podemos montar uma string usando comandos JPQL(Java Persistence Query Language) e passar para o mtodo createQuery() da interface EntityManager, chamamos isso de consulta dinmica, pois possvel montar uma string de forma dinmica com o select que desejamos executar.

Exemplo (select sem uso de parmetros): JPAQuery.java


package br.uniban.main; import java.util.List; import import import import javax.persistence.EntityManager; javax.persistence.EntityManagerFactory; javax.persistence.Persistence; javax.persistence.Query;

import br.uniban.entity.Carro; public class JPAQuery { /** * @param args */ public static void main(String[] args) { EntityManagerFactory emf = Persistence.createEntityManagerFactory("aula9PU"); EntityManager em = emf.createEntityManager(); try{ em.getTransaction().begin(); Query query = em.createQuery("SELECT carro FROM Carro carro"); List<Carro> listaCarros = query.getResultList(); for (Carro carro : listaCarros) { System.out.println(carro); } em.getTransaction().commit(); } catch(Exception e){ System.out.println(e.getMessage()); }

Tpicos Avanados de Programao - Ano:2011


finally{ em.close(); } } }

Prof.Fbio Rener

Exemplo (select com uso de parmetros): JPAQuery2.java


package br.uniban.main; import java.util.List; import import import import javax.persistence.EntityManager; javax.persistence.EntityManagerFactory; javax.persistence.Persistence; javax.persistence.Query;

import br.uniban.entity.Carro; public class JPAQuery2 { /** * @param args */ public static void main(String[] args) { EntityManagerFactory emf = Persistence.createEntityManagerFactory("aula9PU"); EntityManager em = emf.createEntityManager(); try{ em.getTransaction().begin(); Query query = em.createQuery("SELECT carro FROM Carro carro where carro.nome like :n "); query.setParameter("n", "%Fiesta%"); List<Carro> listaCarros = query.getResultList(); for (Carro carro : listaCarros) { System.out.println(carro); } em.getTransaction().commit(); } catch(Exception e){ System.out.println(e.getMessage()); } finally{ em.close(); } } }

Tpicos Avanados de Programao - Ano:2011 JPA Named Queries.

Prof.Fbio Rener

Consultas nomeadas so consultas estticas definidas na sua entidade, essas consultas no podem ser alteradas e podem receber parmetros, devem ser escritas usando JPQL. Para usarmos o recurso de consulta nomeada devemos usar a annotation @NamedQuery ou @NamedQueries.

@NamedQueries usado quando temos varias consultas nomeadas, dentro dessa anotao podemos ter varias @NameQuery.

@NameQuery usada para mapear uma consulta dentro da prpria entidade, essa anotao recebe os parmetros, name (nome da consulta) e query (comando jpql que ser executado). Para executarmos uma consulta nomeada devemos usar o mtodo createNamedQuery da interface EntityManager e passar o nome que registramos nossa consulta durante o mapeamento.

Carro.java
package br.uniban.entity; import javax.persistence.*; import br.uniban.entity.pk.CarroPK; @Entity @Table(name="tb_carro", schema="uniban") @NamedQuery(name="Carro.findAll", query="SELECT carro FROM Carro carro") public class Carro { @EmbeddedId private CarroPK carroPK; @Column(name="str_nome", length=80) private String nome; public CarroPK getCarroPK() { return carroPK; } public void setCarroPK(CarroPK carroPK) { this.carroPK = carroPK; } public String getNome() { return nome; } public void setNome(String nome) { this.nome = nome; } @Override public String toString() { return "Carro [carroPK=" + carroPK + ", nome=" + nome + "]"; }

Tpicos Avanados de Programao - Ano:2011

Prof.Fbio Rener

JPAQuery3.java
package br.uniban.main; import java.util.List; import import import import javax.persistence.EntityManager; javax.persistence.EntityManagerFactory; javax.persistence.Persistence; javax.persistence.Query;

import br.uniban.entity.Carro; public class JPAQuery3 { /** * @param args */ public static void main(String[] args) { EntityManagerFactory emf = Persistence.createEntityManagerFactory("aula9PU"); EntityManager em = emf.createEntityManager(); try{ em.getTransaction().begin(); Query query = em.createNamedQuery("Carro.findAll"); List<Carro> listaCarros = query.getResultList(); for (Carro carro : listaCarros) { System.out.println(carro); } em.getTransaction().commit(); } catch(Exception e){ System.out.println(e.getMessage()); } finally{ em.close(); } } }

Usando @NamedQueries. 4

Tpicos Avanados de Programao - Ano:2011

Prof.Fbio Rener

Carro.java
package br.uniban.entity; import javax.persistence.*; import br.uniban.entity.pk.CarroPK; @Entity @Table(name="tb_carro", schema="uniban") @NamedQueries({ @NamedQuery(name="Carro.findAll", query="SELECT carro FROM Carro carro"), @NamedQuery(name="Carro.findByLikeNome", query="SELECT carro FROM Carro carro WHERE carro.nome like :n") }) public class Carro { @EmbeddedId private CarroPK carroPK; @Column(name="str_nome", length=80) private String nome; public CarroPK getCarroPK() { return carroPK; } public void setCarroPK(CarroPK carroPK) { this.carroPK = carroPK; } public String getNome() { return nome; } public void setNome(String nome) { this.nome = nome; } @Override public String toString() { return "Carro [carroPK=" + carroPK + ", nome=" + nome + "]"; } }

JPAQuery4.java
package br.uniban.main; import java.util.List; import import import import javax.persistence.EntityManager; javax.persistence.EntityManagerFactory; javax.persistence.Persistence; javax.persistence.Query;

import br.uniban.entity.Carro; public class JPAQuery4 {

Tpicos Avanados de Programao - Ano:2011

Prof.Fbio Rener

/** * @param args */ public static void main(String[] args) { EntityManagerFactory emf = Persistence.createEntityManagerFactory("aula9PU"); EntityManager em = emf.createEntityManager(); try{ em.getTransaction().begin(); Query query = em.createNamedQuery("Carro.findByLikeNome"); query.setParameter("n", "%Fiesta%"); List<Carro> listaCarros = query.getResultList(); for (Carro carro : listaCarros) { System.out.println(carro); } em.getTransaction().commit(); } catch(Exception e){ System.out.println(e.getMessage()); } finally{ em.close(); } } }

Exerccios de Fixao:

1. Qual annotation usada para mapear uma lista de consultas nomeadas?

2. Qual annotation usada para mapear uma consulta, de um exemplo?

3. Quando usamos consulta nomeada qual mtodo da interface EntityManager devemos usar para executar essa consulta?

Tpicos Avanados de Programao - Ano:2011

Prof.Fbio Rener

4. Escreva uma entidade para a tabela abaixo e mapeia as seguinte consultas : a) Consulta por nome usando like; b) Consulta por endereo; c) Consulta por nome e telefone;

Anda mungkin juga menyukai