2
respostas

Erro na JPQL

Simplesmente nao funciona pra mim, no exemplo abaixo esta sem os ':' antes de series porque com eles nao retorna nada, e sem eles retorna as top 5 series do banco todo nao da serie selecionada.IMetodo JPQL Chamada na Main Sem os ':' Com os ':'

2 respostas

Olá, Matheus! Como vai?

Parece que o problema está relacionado ao uso dos parâmetros na sua consulta JPQL. Quando você utiliza :serie, está indicando que é um parâmetro que deve ser passado para a consulta. Vamos corrigir isso:

  1. Certifique-se de que o parâmetro está sendo passado corretamente: Na chamada do método top5EpisodesBySerie, você deve passar o objeto Series que deseja usar na consulta.

  2. Verifique a anotação @Query: A consulta deve estar corretamente formatada. Certifique-se de que está assim:

    @Query("SELECT e FROM Serie s JOIN s.episodios e WHERE s = :serie ORDER BY e.avaliacao DESC")
    List<Episodio> top5EpisodiosPorSerie(@Param("serie") Serie serie);
    
  3. Cheque o método de chamada: Na sua classe principal, onde você chama esse método, certifique-se de que está passando a série correta:

    List<Episodio> topEpisodios = repositorio.top5EpisodiosPorSerie(serie);
    
  4. Verifique o uso do LIMIT: O LIMIT não é suportado diretamente em JPQL. Para limitar os resultados, você pode usar o método Pageable do Spring Data JPA:

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

    E ao chamar o método:

    Pageable topFive = PageRequest.of(0, 5);
    List<Episodio> topEpisodios = repositorio.top5EpisodiosPorSerie(serie, topFive);
    

Espero que essas dicas ajudem a resolver o problema! Mas caso não resolvam, peço que compartilhe todo o seu projeto para que eu possa testar outras possibilidades. Recomendo que faça isso usando o GitHub.

Bons estudos!

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

Se, mesmo após aplicar a dica dada, vale checar:

  • Assinatura & Repositório
  • Mapeamento das entidades: Serie: @OneToMany(mappedBy = "serie", cascade = CascadeType.ALL, fetch=FetchType.EAGER) Episódio: @ManyToOne

conforme descreveu no video, o codigo também funciona sem o uso do @Param Insira aqui a descrição dessa imagem para ajudar na acessibilidade

  • Porem deve add na dependencia
                    <compilerArgs>
                        <arg>-parameters</arg>
                    </compilerArgs>