Criando Named query

Existem várias formas de realizar uma consulta em java, uma delas é através de NamedQuery que são consultas estáticas definidas na entidade.

Como Definir uma NamedQuery

...
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;

@Entity
@NamedQueries({
        @NamedQuery(name = "Empresa.findByCnpj", query = "Select e from Empresa e where e.cnpj = :cnpj ")
})
public class Empresa {
    
    @Id
    private Long id;

    private String cnpj;
    
    ...
}
  • @NamedQueries: Define uma área para criação de NamedQuery;
  • @NamedQuery: Define uma NamedQuery;
  • name: Define o nome da NamedQuery. Obs: por organização é bacana utilizar o Nome da entidade “.” o nome da NamedQuery(nomeEntidade.nomeQuery);
  • query: A query em Java Persistence query language;

Como utilizar ?

public Empresa findByCnpj(String cnpj) {
        return getEntityManager().createNamedQuery(
                "Empresa.findByCnpj",  Empresa.class)
                .setParameter("cnpj", cnpj).getSingleResult();
    }
  • getEntityManager().createNamedQuery: Usa o entityManager para criar uma NamedQuery;
  • createNamedQuery(“Empresa.findByCnpj”, Empresa.class): o método createNamedQuery recebe o nome da NamedQuery e o tipo da classe de retorno da query;
  • .setParameter: Como a query Empresa.findByCnpj exige um parametro(:cnpj) é necessário passar um valor por parametro;
  • getSingleResult: Retorna o único valor query;
Observação
O tipo de retorno não é obrigatório mas é uma boa prática utilizar

Porque utilizar NamedQuery ?

NamedQuery é uma maneira de simplificar e centralizar querys no projeto, de forma que ao abrir uma entidade é possível ter uma visão geral de seu impacto no sistema.

Quando utilizar NamedQuery ?

Sempre que possível! exceto em query que tenham lógica em parametros ex: if(cnpj != null) where cnpj = :cnpj

Anúncios

2 comentários sobre “Criando Named query

  1. Muito show, mas tenho uma dúvida. Um @NamedQuery só retorna um objeto ou pode retornar um valor, tipo, apenas o id de uma consulta, sem ter que trazer todo o objeto com seus relacionamentos para pegar apenas um id? Se é possível, como seria?

    Curtir

    • Sim é possível retornar apenas um atributo ou um conjunto de atributos sem a necessidade de retornar todo objeto.

      Para retornar apenas um atributo basta especificar qual atributo da entidade você quer retornar, por exemplo: e.id, assim a namedQuery ficando da seguinte forma:
      @NamedQuery(name = “Empresa.findIdByCnpj”, query = “select e.id from Empresa e where e.cnpj = :cnpj “)

      Para retornar um conjunto você pode utilizar o select new do JPA, que infere o retorno dentro de uma classe através do construtor, como no exemplo abaixo:
      @NamedQuery(name = “Empresa.findDTOByCnpj”, query = “select new br.com.dto.EmpresaDTO(e.id, e.nome, e.cnpj) from Empresa e where e.cnpj = :cnpj “)

      Curtir

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.