Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
1
respuesta

Top 5 episodios

En SerieController.java

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

En SerieService.java

 public List<EpisodioDTO> obtenerTopEpisodios(Long id) {
        var serie = repository.findById(id).get();
        return repository.top5Episodios(serie)
                .stream()
                .map(e -> new EpisodioDTO(e.getTemporada(), e.getTitulo(),
                        e.getNumeroEpisodio()))
                .collect(Collectors.toList());
    }

En SerieRepository.java

@Query("SELECT e FROM Serie s JOIN s.episodios e WHERE s = :serie ORDER BY e.evaluacion DESC LIMIT 5 ")
    List<Episodio> top5Episodios(Serie serie);

Imagen de Screenmatch con la serie Dexter y sus 5 mejores episodios

1 respuesta

¡Hola Estudiante, espero que estés bien!

Parece que has configurado correctamente el endpoint para obtener los 5 mejores episodios de una serie. Sin embargo, hay un pequeño detalle en tu consulta SQL en SerieRepository.java que podría estar causando problemas.

En JPQL, no puedes usar LIMIT directamente. En su lugar, debes manejar la paginación en el código Java. Aquí tienes cómo podrías ajustar tu código:

  1. Modificar la consulta JPQL:
@Query("SELECT e FROM Serie s JOIN s.episodios e WHERE s = :serie ORDER BY e.evaluacion DESC")
List<Episodio> topEpisodios(Serie serie, Pageable pageable);
  1. Ajustar la llamada en SerieService.java:
public List<EpisodioDTO> obtenerTopEpisodios(Long id) {
    var serie = repository.findById(id).get();
    Pageable topFive = PageRequest.of(0, 5);
    return repository.topEpisodios(serie, topFive)
            .stream()
            .map(e -> new EpisodioDTO(e.getTemporada(), e.getTitulo(), e.getNumeroEpisodio()))
            .collect(Collectors.toList());
}

Con estos cambios, deberías poder obtener los 5 mejores episodios correctamente. Asegúrate de que el front-end esté llamando al endpoint correcto y que la API esté actualizada.

Espero haber ayudado y buenos estudios!