Interface Query

A interface Query é responsável por:

  • Fazer as consultas;
  • Executar updates;
  • Passar parâmetros para consulta;
  • Pegar um simples resultado;
  • Pegar uma lista de resultados.

Para executar uma consulta utilizamos a interface javax.persistence.Query e criamos uma Query a partir do EntityManager, exemplo:

public List<Emprestimo> consultarTodos() {
  EntityManager em = getEntityManager();
  Query query = em.createNamedQuery("Emprestimo.consultarTodos");
  return query.getResultList();
}

Nesse exemplo estamos utilizando a EntityManager para criar uma consulta nomeada através do método getNamedQuery e passamos o nome da consulta "Emprestimo.consultarTodos" declarado na entidade.

Através da EntityManager podemos utilizar o método createQuery para criar a consulta e já declarar todo o código dela, podendo criar uma consulta um pouco mais personalizada:

Query query = em.createQuery("SELECT c FROM Cliente c");

Também podemos criar uma consultas nativa para uma base de dados especifica:

Query query = em.createNativeQuery("SELECT * FROM Cliente");

Para executar uma consulta podemos ter como resposta um simples objeto ou uma lista de objetos.

Neste exemplo vamos executar uma consulta que retorna uma lista de objetos:

Query query = em.createNamedQuery("Cliente.consultarTodosClientes");
List<Cliente> clientes = (List<Cliente>) query.getResultList();

Quando utilizamos o método getResultList da interface Query é retornado uma lista de entidades.

Consulta que retorna um único objeto:

Query query = em.createNamedQuery("Emprestimo.qtdEmprestimosPorLivro");
Long quantidade = (Long) query.getSingleResult();

Quando utilizamos o método getSingleResult da interface Query é retornado apenas um objeto. Este método pode lançar também a exceção javax.persistence.NoResultException quando a consulta não retorna nenhum resultado ou também uma exceção javax.persistence.NonUniqueResultException quando você espera retornar apenas um objeto e a consulta acaba retornando mais de um objeto.

Através da interface Query podemos passando parâmetros para a consulta através do método setParameter:

public List<Emprestimo> consultarTodosPorTituloLivro
  (String tituloLivro) {

  EntityManager entityManager = getEntityManager();
  Query query = entityManager.createNamedQuery
    ("Emprestimo.consultarTodosPorTituloLivro");

  query.setParameter("titulo", tituloLivro);

  return query.getResultList();
}

Exemplo de classe DAO que executa as operações: salvar, alterar, remover, consultar por id, consultar todos os empréstimos, consultar a quantidade de empréstimos de um livro e consultar todos os empréstimos de um livro.

package pbc.jpa.exemplo.dao;

import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
import pbc.jpa.exemplo.modelo.Emprestimo;

/**
 * Classe utilizada para representar as 
 * operações sobre a entidade emprestimo.
 */
public class EmprestimoDAO {
  public EntityManager getEntityManager() {
    EntityManagerFactory factory = null;
    EntityManager entityManager = null;
    try {
      factory = Persistence.createEntityManagerFactory
        ("UnidadeDePersistencia");
      entityManager = factory.createEntityManager();
    } finally {
      factory.close();
    }
    return entityManager;
  }

  public Emprestimo consultarPorId(Long id) {
    EntityManager entityManager = getEntityManager();
    Emprestimo emprestimo = null;

    try {
      emprestimo = entityManager.find(Emprestimo.class, id);
    } finally {
      entityManager.close();
    }

    return emprestimo;
  }

  public Emprestimo salvar(Emprestimo emprestimo) {
    EntityManager entityManager = getEntityManager();
      try {
        entityManager.getTransaction().begin();
        if(emprestimo.getId() == null) {
          entityManager.persist(emprestimo);
        } else {
          entityManager.merge(emprestimo);
        }
          entityManager.flush();
          entityManager.getTransaction().commit();
      } catch (Exception ex) {
        entityManager.getTransaction().rollback();
      } finally {
        entityManager.close();
    }

    return emprestimo;
  }

  public void apagar(Long id) {
    EntityManager entityManager = getEntityManager();
    try {
      entityManager.getTransaction().begin();
      Emprestimo emprestimo = entityManager.
        find(Emprestimo.class, id);
      entityManager.remove(emprestimo);
      entityManager.flush();
      entityManager.getTransaction().commit();
    } catch (Exception ex) {
      entityManager.getTransaction().rollback();
    } finally {
      entityManager.close();
    }
  }

  public List<Emprestimo> consultarTodos() {
    EntityManager entityManager = getEntityManager();
    Query query = entityManager.createNamedQuery
      ("Emprestimo.consultarTodos");
    return query.getResultList();
  }

  public Long getQtdEmprestimosPorLivro(Long id) {
    EntityManager entityManager = getEntityManager();
    Query query = entityManager.createNamedQuery
      ("Emprestimo.qtdEmprestimosPorLivro");
    query.setParameter("id", id);
    return (Long) query.getSingleResult();
  }

  public List<Emprestimo> consultarTodosPorTituloLivro
    (String tituloLivro) {
    EntityManager entityManager = getEntityManager();
    Query query = entityManager.createNamedQuery
      ("Emprestimo.consultarTodosPorTituloLivro");
    query.setParameter("titulo", tituloLivro);
    return query.getResultList();
  }
}

results matching ""

    No results matching ""