Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

[Dúvida] Porque foi utilizado o objeto Serie como parâmetro?

Bom dia pessoal, nas aulas anteriores as professoras definiram também outros métodos na SerieRepository. Segue o código abaixo:

public interface SerieRepository extends JpaRepository<Serie, Long> {

    Optional<Serie> findByTituloContainingIgnoreCase(String titulo);

    List<Serie> findByAtoresContainingIgnoreCaseAndAvaliacaoGreaterThanEqual(String nomeAtor, Double avaliacao);

    List<Serie> findTop5ByOrderByAvaliacaoDesc();

    List<Serie> findByGenero(Categoria genero);

    // List<Serie> findByTotalTemporadasLessThanEqualAndAvaliacaoGreaterThanEqual(Integer quantidade, Double avaliacao);

    @Query("SELECT s FROM Serie s WHERE s.totalTemporadas <= :quantidade AND s.avaliacao >= :avaliacao")
    List<Serie> seriesPorTemporadaEAvaliacao(Integer quantidade, Double avaliacao);

    @Query("SELECT e FROM Serie s JOIN s.episodios e WHERE e.titulo ILIKE %:trechoEpisodio%")
    List<Episodio> episodiosPorTrecho(String trechoEpisodio);

    @Query("SELECT e FROM Serie s JOIN s.episodios e WHERE s.titulo = :titulo ORDER BY e.avaliacao DESC LIMIT 5")
    List<Episodio> top5EpisodiosPorSerie(String titulo);
}

Fiquei com dúvida pois nessa aula do top 5 episódios por série, ao invés de passar apenas a String com o título, o parâmetro que foi passado na aula foi o Serie.

Insira aqui a descrição dessa imagem para ajudar na acessibilidadeAparentemente o jeito que eu fiz com a String, também funcionou normalmente, mas queria saber qual seria a maneira mais apropriada.

4 respostas

Olá! Caike! Tudo bem?

A escolha de passar um objeto Serie como parâmetro no método topEpisodiosPorSerie pode ser uma questão de design e clareza no código. Ao usar o objeto Serie, você está trabalhando diretamente com a entidade, o que pode ser mais intuitivo em certos contextos, especialmente se você já tem o objeto carregado e deseja evitar uma nova consulta apenas para obter o título.

Além disso, passar o objeto Serie pode ajudar a garantir que você está lidando com uma série válida, pois o objeto já teria sido validado e carregado anteriormente. Isso pode evitar problemas de consistência, caso o título não corresponda exatamente a uma série no banco de dados.

No entanto, se o seu método funciona bem com a String do título e você não tem problemas com performance ou consistência, essa abordagem também é válida. A escolha entre uma ou outra pode depender do contexto e das necessidades específicas do seu projeto.

Espero ter ajudado e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.

Entendi Armano, muito obrigado, só fiquei com mais uma dúvida.

Quando a gente passa a Serie como parâmetro, foi utilizado o objeto Serie dentro do JPQL ( :serie ) , essa possibilidade de passar o objeto dentro da query, é por conta do JPQL?

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

solução!

Oi, Caike!

Sim, essa possibilidade de passar o objeto inteiro como parâmetro na consulta acontece por conta do JPQL. No JPQL, você pode passar entidades inteiras como parâmetros e o framework entende como utilizar seus atributos internamente.

No seu caso, quando passa uma instância de Serie, o JPQL usa a chave primária (id) dessa entidade para fazer a comparação correta no banco de dados, sem que você precise escrever isso manualmente.

Se você quiser, a consulta pode ficar assim para usar o objeto diretamente:

@Query("SELECT e FROM Episodio e WHERE e.serie = :serie ORDER BY e.avaliacao DESC")
List<Episodio> top5EpisodiosPorSerie(@Param("serie") Serie serie);

E para garantir o limite de 5 episódios, você faria a limitação no próprio método do repositório, usando a palavra Top5 no nome do método ou controlando no código.

Fico à disposição.

Me ajudou muito, obrigado Armano!