Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

1
resposta

[Projeto] Desafio Final

Eu resolvi da seguinte maneira e preferi o retorno de uma lista vazia em vez de null

SerieController

@GetMapping("/{id}/temporadas/top")
    public List<EpisodioDTO> obterEpisodiosTopCinco(@PathVariable Long id) {
        return servico.obterEpisodiosTopCinco(id);
    }

SerieService

public List<EpisodioDTO> obterEpisodiosTopCinco(Long id) {
        return repository.topEpisodiosPorSerie(id, PageRequest.of(0, 5))
                .stream()
                .map(e -> new EpisodioDTO(
                        e.getTemporada(),
                        e.getNumeroEpisodio(),
                        e.getTitulo(),
                        e.getAvaliacao()
                ))
                .collect(Collectors.toList());
    }

SerieRepository

@Query("SELECT e FROM Serie s JOIN s.episodios e WHERE s.id = :id ORDER BY e.avaliacao DESC")
    List<Episodio> topEpisodiosPorSerie(Long id, Pageable pageable);

**Obs: Utilizei Pageable com PageRequest.of(0, 5) para limitar o retorno aos cinco episódios mais bem avaliados. Dessa forma, a paginação é feita pelo Spring Data e evita o uso de LIMIT, que não pertence ao padrão JPQL.

  • Mudei o front tb para aparecer a avaliação do top5 episodios, na função carregarTopEpisodios eu adicionei

Series.js

Episódio ${serie.numeroEpisodio} - Temporada ${serie.temporada} - ${serie.titulo} - Avaliação: ${serie.avaliacao}
1 resposta

Olá, Vinicius! Como vai?

Parabéns pela resolução da atividade!

Vi que você explorou o Pageable para limitar resultados com Spring Data JPA, utilizou muito bem a Stream API para mapear os episódios em DTOs e ainda compreendeu a importância da consulta com ordenação para trazer os mais bem avaliados.

Uma dica interessante para o futuro é aplicar Optional em consultas que podem não retornar dados, garantindo maior segurança. Assim:

public List<EpisodioDTO> obterEpisodiosTopCinco(Long id) {
    return Optional.ofNullable(
            repository.topEpisodiosPorSerie(id, PageRequest.of(0, 5))
        )
        .orElse(Collections.emptyList())
        .stream()
        .map(e -> new EpisodioDTO(
                e.getTemporada(),
                e.getNumeroEpisodio(),
                e.getTitulo(),
                e.getAvaliacao()
        ))
        .collect(Collectors.toList());
}

Isso faz com que o retorno seja sempre uma lista, evitando NullPointerException.

Se quiser aprofundar ainda mais, algumas boas práticas são:

  • Paginação configurável: permitir que o cliente escolha o tamanho da página.
  • DTOs bem definidos: separar claramente entidades de transferência de dados.
  • Mensagens claras no front: exibir feedback quando não houver episódios retornados.

Ah, uma pergunta: você acha que retornar sempre uma lista vazia em vez de null melhora a robustez do código ou prefere manter o retorno nulo para indicar ausência explícita de dados?

Fico à disposição! E se precisar, conte sempre com o apoio do fórum.

Abraço e bons estudos!

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!