Aprendendo Spring: #5 – JpaRepository

Tempo de leitura: menos de 1 minuto

Fala aí galera, tudo certo?

Vou escrever hoje, sobre repository em Spring Boot.

Mas antes, caso seja seu primeiro contato com Spring Boot e não acompanhou os posts anteriores, seguem abaixo os links. São leituras recomendadas:

Dependências

Para usarmos repository em uma aplicação Spring Boot, primeiramente será necessário adicionar a dependência Starter Data JPA e de algum banco de dados (H2) .

Se tiver usando Maven, no arquivo pom.xml adicione estas linhas:

https://gist.github.com/edermfl/1fb05c40d091d87b3bbf4994c067dd0f

Caso esteja usando o Gradle, adicione a linha abaixo no arquivo build.gradle:

https://gist.github.com/edermfl/974210a94c5374d8eb8f8d708ebaf503

Configuração

Precisamos fazer a configuração de banco para que possamos persistir os objetos. Neste post usarei o banco de dados H2. Este BD é um banco em memória bem simples. Para maiores informações sobre o H2 consulte o Wikipédia.

Utilizei YAML para configurar o H2:

https://gist.github.com/edermfl/1447d017bd7d57475c4e44cd72d1451f

Implementação

Configuração pronta, vamos agora modela a entidade Cliente para que possamos persisti-la. Ela será bem simples, o nome da tabela será “CLIENTE” e possuirá apenas os atributos id, nome e rg:

https://gist.github.com/edermfl/acbbf07d0b237eccb051822057e594b3

Agora criaremos o repository. O Spring Boot por intermédio do Spring Data, nos auxilia muito deste quesito, já que ele possui implementações default de repository, assim o que precisamos fazer é basicamente criar uma interface.

Esta interface tem que estender a interface do Spring Data chamada JpaRepository. Vejamos o exemplo abaixo:

https://gist.github.com/edermfl/4fa16d7fb4181980d894fc3ae7729056

Na linha 1 anotei a classe com @Repository, esta anotação é apenas uma wrapper para @Component, que diz ao Spring Boot que essa classe deve estar disponível para ser injetada, funciona como anotação tipificadora.

Mas o mais importante desta interface está na linha 2. Como disse anteriormente, a interface deve estender JpaRepository, nela devemos informar qual é a entidade quer será persistida e qual o tipo do id da entidade. Talvez você nem precise declarar nenhum método, pois só que fazer isso, o repository já ganhou implementação de vários métodos:

  • findAll;
  • findOne;
  • save;
  • existis…

Mas estes métodos podem não ser suficientes. E se eu precisar fazer uma buscar clientes por RG? Simples basta fazermos o seguinte:

https://gist.github.com/edermfl/b8396304d43e80517e2b1292d3ec850e

Pronto, a implementação do findByRg fica a cargo do Spring Boot! Todos os atributos mapeados na entidade podem ser usados, no caso a entidade Cliente tem um atributo rg, por isso quando criamos findByRg o Spring sabe exatamente qual atributo usar na query.

É possível também pesquisar com varias condições, suponha que tenhamos que pesquisar por RG e nome do Cliente. Para isto, na declaração do método usamos a palavra reservada And, desta forma a declaração ficaria assim:

https://gist.github.com/edermfl/28b8cd9ec38714e2eba289e44de21491

Nota: A ordem dos paramentos devem respeitar a ordem dos atributos na declaração do método.

Além da palavra reservada And, você pode usar:

  • Or;
  • OrderBy;
  • Asc e Desc;
  • Count, Sum, Avg;

Vendo estas implementações, você pode pensar que Spring Boot funciona muito bem, quando preciso fazer queries simples. Mas isto não é verdade, é possível usar fazer queries mais refinadas, neste caso a anotação @Query, pode ajudar bastante.

@Query recebe no value uma String, que nada mais é q a query que será executada. Você pode optar em usar JPql ou SQL nativo, como pode ser visto no exemplo abaixo:

https://gist.github.com/edermfl/36d9c3a6c5d862e59939635b4c305096

Para mais informação sobre a anotação @Query acesse a documentação do String Data.

Criei teste para realmente saber se o repository funciona:

https://gist.github.com/edermfl/33a9b166fe68f5861d6c929ef6cae0cd

Por fim deixo exemplo de usa de repository, executando uma query complexa (vários joins) e retornando uma lista de entidades:

https://gist.github.com/edermfl/ba5cff9e0d6a2c98dbe5986c5917a3cd

Para mais informação sobre Spring Data, não deixe de consultar a documentação oficial. Este post tem por objetivo apenas mostrar um pouquinho do potencial de “fodático” framework.

Deixo também o link do GitHub, caso alguém queira baixar o fonte do projeto.

Até mais pessoal.

1 comentário


  1. Excelente tópico, adorei e aprendi bastante, obrigado por compartilhar estes ensinamentos.
    Uma dúvida, como posso pesquisar no banco de dados uma informação que esteja gravada assim no banco de dados “Matematica” e no campo pesquisa, o usuário pesquisa matematica, ou MATEMATICA, tentei por o like “%:dadoProcurado%” porem como citei se o usuario procura por matematica minusculo ele não acha, pra achar o usuario tem que utilizar Mate por exemplo, para poder achar, lembro que no criteria do hibernate existe um comando que ele utiliza para não importar o que pesquisar, seria este MatchMode.ANYWHERE.
    Novamente, obrigado pelo tópico.
    Desde já
    Eder

    Responder

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *