Skip to content

Latest commit

 

History

History
232 lines (138 loc) · 14 KB

File metadata and controls

232 lines (138 loc) · 14 KB

Projeto 02 - Blog Pessoal - Classe PostagemController - Método Consultar Postagens por Título

O que veremos por aqui:

  1. Criar o Método getByTitulo(String titulo) para listar uma Postagem específica

1. O Recurso Postagem

Nas etapas anteriores, começamos a construir a Classe PostagemController e implementamos os Métodos:

  • getAll() 🡪 Retorna todos os Objetos da Classe Postagem persistidos no Banco de dados.
  • getById(Long id) 🡪 Retorna um Objeto específico da Classe Postagem persistidos no Banco de dados. A Postagem é identificada pelo Atributo id.

Vamos continuar a construção da nossa Classe Controladora implementando o Método getByTitulo( String titulo ), que retornará todos os Objetos da Classe Postagem persistidos no Banco de dados, cujo Atributo titulo contenha a String enviada no parâmetro titulo do Método.

classDiagram
    class Postagem {
        - Long id
        - String titulo
        - String texto
        - LocalDateTime data
        
        + getAll() ResponseEntity List ~Postagem~
        + getById(Long id) ResponseEntity ~Postagem~
        + getByTitulo(String nome) ResponseEntity List ~Postagem~
        + post(Postagem postagem) ResponseEntity ~Postagem~
        + put(Postagem postagem) ResponseEntity ~Postagem~
        + delete(Long id) void
    }

Loading

👣 Passo 01 - Implementar a Query Methods

Para implementarmos o Método de Consulta por título getByTitulo(String titulo) será necessário criar uma Query Methods na Interface PostagemRepository. Desta forma, o Diagrama de Classes da nossa Interface sofrerá uma alteração:

classDiagram
    class PostagemRepository {
        <<interface>>
        + findAllByTituloContainingIgnoreCase(String titulo) List ~Postagem~
    }

Loading

Query Methods são métodos de consulta personalizados, definidos na interface repositório, que permitem buscar por qualquer atributo da entidade associada. O Spring Data interpreta o nome do método e gera dinamicamente a consulta correspondente em JPQL, que depois é convertida em SQL nativo pelo provedor JPA (como o Hibernate).

Na prática, as Query Methods permitem gerar instruções de consulta em JPQL com base na combinação entre palavras-chave e nomes de atributos da entidade. O Spring Data interpreta o nome do método e cria dinamicamente a consulta correspondente.

JPQL (Java Persistence Query Language) é a linguagem de consulta orientada a objetos utilizada no JPA (Java Persistence API). Ela é similar ao SQL, mas opera sobre entidades Java e seus atributos, em vez de tabelas e colunas do banco de dados.

Na prática, quando você escreve uma Query Methods:

  1. O Spring Data JPA interpreta o nome do método.
  2. Ele gera dinamicamente uma consulta em JPQL com base nesse nome.
  3. A consulta JPQL gerada é convertida pelo provider JPA (Hibernate) em uma consulta SQL nativa, que será executada no banco.

Graças ao JPQL, o JPA consegue operar em qualquer Banco de dados Relacional, sem a necessidade de reescrever métodos ou consultas.


Exemplo 01:

Query Method

public Optional <Postagem> findByTitulo(String titulo);

Instrução SQL equivalente

SELECT * FROM tb_postagens WHERE titulo = "titulo";
Palavra Chave Instrução SQL
find 🡪 SELECT
By 🡪 WHERE
Titulo 🡪 Atributo da Classe Postagem
String titulo 🡪 Parâmetro do Método contendo o título que você deseja procurar.

Como esta consulta retornará apenas um Objeto da Classe Postagem ou um Objeto Nulo, caso a consulta não encontre nada, o Método foi assinado com apenas um Objeto da Classe Postagem do tipo Optional para evitar o erro NullPointerException (Objeto Nulo).

Exemplo 02:

Query Method

public List <Postagem> findAllByTituloContainingIgnoreCase(String titulo);

Instrução SQL equivalente

SELECT * FROM tb_postagens WHERE titulo LIKE "%titulo%";

Palavra Chave Instrução SQL
find 🡪 SELECT
All 🡪 *
By 🡪 WHERE
Titulo 🡪 Atributo da Classe Postagem
Containing 🡪 LIKE "%titulo%"
IgnoreCase 🡪 Ignorando letras maiúsculas ou minúsculas
@Param("titulo") 🡪 Define a variável String titulo como um parâmetro da consulta. Esta anotação é opcional em consultas do tipo Like.
String titulo 🡪 Parâmetro do Método contendo o título que você deseja procurar.

Como esta consulta retornará um ou mais Objetos da Classe Postagem, o Método foi assinado com uma Collection List de Objetos da Classe Postagem.

ATENÇÃO: A instrução FROM tb_postagens será inserida pelo JPA ao checar o nome da tabela gerada pela Classe Postagem.

DICA: Acesse o Guia do JPA e explore outras opções de Query Methods (Métodos de Consulta), com exemplos implementados. Pedimos apenas que não implemente os exemplos do Guia no Projeto Blog Pessoal.

O Exemplo 02 será criado dentro da Interface PostagemRepository e será implementado na Classe PostagemController. Veja o código abaixo, implementado na Interface:

Observe que a Query Method do Exemplo 02 foi adicionada na linha 12 da Interface PostagemRepository. Observe que depois de Criar a Query Methods foram importados mais 2 pacotes na Interface PostagemRepository, como mostra a imagem acima (indicados pelas Setas vermelhas).

Para concluir, não esqueça de Salvar o código (File 🡪 Save All) .



👣 Passo 02 - Criar o Método getByTitulo(String titulo)

Vamos implementar o Método getByTitulo(String titulo) na Classe Postagem Controller. Traçando um paralelo com o MySQL, seria o equivalente a instrução: SELECT * FROM tb_postagens where titulo like "%titulo%";.

Linha 37: a anotação @GetMapping indica que o Método getAll(), responderá a todas as requisições do tipo HTTP GET, enviadas no endereço http://localhost:8080/postagens/titulo/{titulo}.

ATENÇÃO: O Endereço deste Endpoint será composto pelo Endereço do Recurso (@RequestMapping) + a variável de caminho indicada na anotação @GetMapping. Lembre-se que não pode existir dois ou mais Métodos do tipo GET com o mesmo endereço.

Linha 38: O Método getByTitulo(String titulo) será do tipo ResponseEntity porquê ele responderá a Requisição HTTP (HTTP Request), com uma Resposta HTTP (HTTP Response).

: O Método além de retornar um objeto da Classe ResponseEntity (OK 🡪200), no parâmetro body (Corpo da Resposta), será retornado um Objeto da Classe List (Collection), contendo todos os Objetos da Classe Postagem persistidos no Banco de dados, na tabela tb_postagens, cujo Atributo titulo contenha a String enviada como parâmetro do Método.

Linha 39: return ResponseEntity.ok(postagemRepository.findAllByTituloContainingIgnoreCase(String titulo)); Executa o Método findAllByTituloContainingIgnoreCase(String titulo) (Método personalizado, criado na Interface PostagemRepository), e exibe o resultado () no Corpo da Resposta. Mesmo que nenhuma postagem seja encontrada, a lista nunca será null — apenas vazia. Por isso, o ResponseEntity.ok() será retornado com status 200 OK em todos os casos.

Para concluir, não esqueça de Salvar o código (File 🡪 Save All) e verificar se o Projeto está em execução



👣 Passo 03 - Testar no Insomnia

Agora vamos criar a Requisição para o Método getByTitulo(String titulo):

  1. Clique com o botão direito do mouse sobre a Pasta Postagem para abrir o menu e clique na opção New HTTP Request.
  1. Será criada uma nova Requisição (New Request) dentro da pasta Postagem.

  2. Dê um duplo clique sobre a nova requisição (New Request), informe o nome da requisição (indicado na imagem abaixo na cor amarela) e pressione a tecla enter do seu teclado.

  1. Selecione o Método HTTP que será utilizado (GET) na requisição, indicado na imagem abaixo na cor verde.
  1. Configure a requisição conforme a imagem abaixo:
  1. No item marcado em amarelo na imagem acima, informe o endereço (endpoint) da Requisição. A requisição Consultar Postagem por Titulo foi configurada da seguinte maneira:
  • A primeira parte do endereço (http://localhost:8080) é o endereço do nosso servidor local. Quando a API estiver na nuvem, ele será substituído pelo endereço da aplicação na nuvem.
  • A segunda parte do endereço é o endpoint configurado na anotação @RequestMapping, em nosso caso /postagens.
  • A terceira parte (/titulo/postagem), titulo é apenas um indicativo do conteúdo da variável que deverá ser preenchida. A palavra postagem é o conteúdo da variável de caminho (@PathVariable) titulo. Informe o texto que você deseja pesquisar.
  1. Para testar a requisição, com a aplicação rodando, clique no botão .

  2. O resultado da requisição você confere na imagem abaixo:

  1. Observe que a aplicação além de exibir os dados de todos os Objetos da Classe Postagem persistidos no Banco de dados, no Corpo da Resposta, respeitando o critério informado na consulta (palavra postagem), ela também retornará um HTTP Status 200 🡪 OK (indicado em verde na imagem acima), informando que a Requisição foi bem sucedida!