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
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
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?
CurtirCurtir
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 “)
CurtirCurtir