Named queries em arquivos externos

Postado por em   ●   25 comentários

Você sabia que as Named Queries são muito importantes dentro do JPA? E que nem todo mundo as usa porque acha ruim colocá-las nas classes de entidades do sistema?

Neste artigo vou te mostrar uma solução simples para este problema das consultas ficarem nas classes do sistema, mostrando como podemos fazer para que elas fiquem em um arquivo externo, mais fácil de ler e manter.

Antes, deixa eu te contar que as Named Queries são as consultas estáticas do seu sistema. O que isso significa? Que são as buscas que as cláusulas de condição não irão mudar.

Por exemplo, em uma determinada tela do sistema você pode informar dois filtros para pesquisar uma pessoa, o código ou o CPF. Isso significa que sua consulta terá que se adaptar em tempo de execução, uma hora fará algo como:

E em outro momento:

E esse é um exemplo muito simples, poderíamos ter muitas outras cláusulas combinadas ali também para criar uma consulta dinâmica ou dynamic query.

Já uma named query não irá mudar nunca no sistema. Mas atenção, esse não mudar significa não adicionar ou remover cláusulas, os valores dos parâmetros podem variar. Ok?

Criei um sistema financeiro muito simples, com apenas alguns testes de integração para demonstrar essa utilização. Ele possui apenas duas entidades, Pessoa e Lancamento. Eu vou demonstrar algumas consultas em ambas as classes e deixo para você treinar, implementar algumas consultas extras nesse modelo, ok?

Você pode acessar o código aqui.

Para adicionar as named queries em arquivos, precisamos realizar alguns passos muito simples.

Primeiro, criar o arquivo que irá conter a consulta JPQL. Para este projeto, coloquei em META-INF/consultas/pessoas.xml as consultas para a entidade Pessoa e em META-INF/consultas/lancamentos.xml para a entidade Lancamento.

Mas você pode definir da forma que quiser, pode pensar em agrupar suas consultas por módulos do sistema, funcionalidades, etc. Enfim, o nome do arquivo está ali para te ajudar, você define o que quer agrupar ali.

Veja o conteúdo do arquivo pessoas.xml:

E o conteúdo do arquivo lancamentos.xml:

Repare que eu posso ter mais de uma named query dentro do mesmo arquivo.

Para que o entity manager consiga ler esses arquivos e carregar essas queries, é necessário adicionar a seguinte tag no persistence.xml:

Pronto, agora é só utilizar normalmente, da mesma forma que usaríamos se estivesse dentro da entidade. Por exemplo, para executar a consulta Lancamento.descricoesQueContem, basta ter o código:

Deixe seu comentário sobre o que você achou e me fale se você já usa Named Queries em seus projetos, e se vai migrar para arquivos externos a partir de agora.

Acesse ou baixe o código-fonte completo deste artigo no GitHub.

Para aprender mais sobre JPA 2 com Hibernate, conheça nosso curso online de Persistência de dados com JPA e Hibernate, que é completo e substitui a necessidade de cursos presenciais.

Instrutor da AlgaWorks. Graduado em Engenharia Elétrica pela Universidade Federal de Uberlândia e detentor das certificações LPIC-1, SCJP e SCWCD. Palestrante internacional, autor e co-autor de livros e instrutor de cursos de Java, JPA, TDD, Design Patterns, Spring, etc.

25 comentários sobre “Named queries em arquivos externos

  1. Genaldo -

    Show de Bola, muito boa a dica e a aula.

    1. Normandes Júnior Autor do post-

      Obrigado Genaldo.

  2. Thiago -

    Excelente informação, muito bom mesmo saber disso.
    Coincidentemente estava procurando isso ontém no google, e não encontrei. De repente abri o email hoje com este artigo exatamente como estava procurando.
    Muito bom, obrigado pelo Artigo!

    1. Normandes Júnior Autor do post-

      Obrigado Thiago. Que coincidência boa hein? hehe
      Abraços.

  3. Felizardo Charles -

    Qual a diferença se eu criar métodos de consulta na classe?

    1. Normandes Júnior Autor do post-

      Olá Felizardo.
      Colocar as consultas em arquivos externos fica mais fácil de você as ler, não ficam em Strings concatenadas na sua classe. Imagine uma consulta maior, uma query mais complicada. Ficaria muito difícil ler em uma classe com strings concatenadas.

  4. Juliano Sena da Silva Carlos -

    Olá, boa tarde Normandes, muito bom seu material, tem servido bastante de aprendizado para mim. Tirei a certificação OCJP recentemente e agora estou entrando na área de Java EE e desejo aprender e dominar o assunto como o pessoal da Algaworks. Parabéns

    1. Normandes Júnior Autor do post-

      Que legal Juliano e parabéns pela certificação.
      Continue ligado que vem mais por ai.
      Abraços.

  5. Marcelo Ribeiro -

    Poxa, muito massa!!! Parabéns, como sempre surpreendendo…

    1. Normandes Júnior Autor do post-

      Obrigado Marcelo.

  6. Mário Falcão -

    Muito bom, excelente maneira para manter o código organizado.

    1. Normandes Júnior Autor do post-

      Obrigado Mário.

  7. Flávio Carvalho -

    Mt bacana essa vídeo aula, como todas as outras ministradas pela algaworks. Uma sugestão para a próxima aula, se possível seria esse mesmo assunto, porém trabalhando com queries dinâmicas.

    Abraços!!!

    1. Normandes Júnior Autor do post-

      Obrigado Flávio.
      Sobre sua sugestão receito que não seja muito usual, pense comigo, como você irá externalizar uma consulta que você não sabe como ela irá ser? Normalmente queries dinâmicas utilizamos Criteria, trabalhando apenas com objetos.
      Acredito que as named queries são as melhores queries para irem a arquivos externos, pois são consultas estáticas.
      Abraços.

  8. Felipe -

    Muito bom.

  9. Agnaldo -

    Parabéns pela iniciativa. Todos os seus vídeos estão sendo muito valiosos.

  10. Antonio Cesar -

    Muito bom… parabéns pelo post!

    1. Normandes Júnior Autor do post-

      Valeu Antonio, obrigado.

  11. Isaqueu -

    Muito boa a dica pra mim que estou iniciando, parabéns.

  12. Arthur Gomes -

    Gostei da explicação. Finalmente entendi a vantagem em utilizar Named queries. Na verdade entendi a situação e qual a vantagem. Isso me fez lembrar que quando comecei a utilizar o Hibernate era comum utilizar estrutura de arquivos XML externos para as consultas. Os chamados HBOs. Mesmo hoje em dia existe quem defenda o uso de HBO pelo simples fato de conseguir mapear as consultas com mais facilidade em caso de manutenção. O uso das anotações no entanto é extremamente mais produtivo no ciclo do desenvolvimento. Mas enfim…defendo a prática que você adotou nessa aula porque dentro de um sistema existem as duas situações de pesquisa, dinâmica e estática.
    Parabéns pela aula e obrigado pelas dicas. Como sempre são muito úteis.

    1. Normandes Júnior Autor do post-

      Obrigado Arthur.
      Você está certo, tem gente que gosta de fazer até o mapeamento nos arquivos xml. Eu prefiro via anotação também. ;)
      Abraço.

  13. Antonio -

    Normandes, como ficaria com native query ?

    1. Normandes Júnior Autor do post-

      Oi Antonio. Dá mesma forma, o objeto Query criado pode ser executado para uma JPQL ou Native Query.

  14. maicon silva -

    Ola Normandes!
    Gostaria de saber se as NamedQuery servem apenas para consultas de dados, ou tbm podem ser usandas para inserção de dados.
    ex :
    tenho as seguintes tabelas País, Estado, Cidade.
    O desempenho ficaria lento, criando uma NamedQuery que preencha essas entidades?

    1. Normandes Júnior Autor do post-

      Olá Maicon.

      Sim, que eu saiba só para consultas mesmo.

Deixe um comentário