Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Dúvida] No property 'finByGenero' found for type 'Serie'

Estou com o código exatamente igual o da aula 04.07 - Buscas por categoria

Estou tendo o seguinte erro:

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'screenmatchApplication': Unsatisfied dependency expressed through field 'repository': Error creating bean with name 'serieRepository' defined in br.com.pedropgaraujo.screenmatch.repository.SerieRepository defined in @EnableJpaRepositories declared on DataJpaRepositoriesRegistrar.EnableJpaRepositoriesConfiguration: No property 'finByGenero' found for type 'Serie'

O código nem inicia, na hora que executo ele já apresenta este erro e finaliza.

Segue as classes utilizadas:

SerieRepository.class

package br.com.pedropgaraujo.screenmatch.repository;

import br.com.pedropgaraujo.screenmatch.model.Categoria;
import br.com.pedropgaraujo.screenmatch.model.Serie;
import org.springframework.data.jpa.repository.JpaRepository;

import java.util.List;
import java.util.Optional;

public interface SerieRepository extends JpaRepository<Serie, Long> {
    Optional<Serie> findByTituloContainingIgnoreCase(String serieName);

    List<Serie> findByAtoresContainingIgnoreCaseAndAvaliacaoGreaterThanEqual(String authorName, Double rate);

    List<Serie> findTop5ByOrderByAvaliacaoDesc();

    List<Serie> finByGenero(Categoria categoria);

}

Serie.class

package br.com.pedropgaraujo.screenmatch.model;

import br.com.pedropgaraujo.screenmatch.service.ConsultaChatGPT;
import jakarta.persistence.*;

import java.util.ArrayList;
import java.util.List;
import java.util.OptionalDouble;

@Entity
@Table(name = "series")
public class Serie {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(unique = true)
    private String titulo;
    private Integer totalTemporadas;
    @Enumerated(EnumType.STRING)
    private Categoria genero;
    private String atores;
    private Double avaliacao;
    private String sinopse;
    private String poster;

    @OneToMany(mappedBy = "serie", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    private List<Episodio> episodioList = new ArrayList<>();

    public Serie(){}

    public List<Episodio> getEpisodioList() {
        return episodioList;
    }

    public void setEpisodioList(List<Episodio> episodioList) {
        episodioList.forEach(e -> e.setSerie(this));
        this.episodioList = episodioList;
    }

    public Serie (DadosSerie dadosSerie){
        this.titulo = dadosSerie.titulo();
        this.totalTemporadas = dadosSerie.totalTemporadas();
        this.avaliacao = OptionalDouble.of(Double.valueOf(dadosSerie.avaliacao())).orElse(0);
        this.genero = Categoria.fromString(dadosSerie.genero().split(",")[0].trim());
        this.atores = dadosSerie.atores();
        this.poster = dadosSerie.poster();
        this.sinopse = String.valueOf(ConsultaChatGPT.obterTraducao(dadosSerie.sinopse()));
    }

   //Getters and Setters


    @Override
    public String toString() {
        return "Genero=" + genero +
                ", titulo='" + titulo + '\'' +
                ", totalTemporadas=" + totalTemporadas +
                ", atores='" + atores + '\'' +
                ", avaliacao=" + avaliacao +
                ", sinopse='" + sinopse + '\'' +
                ", poster='" + poster + '\'' +
                ", episodios='" + episodioList + '\'' +
                '}';
    }
}

Categoria.class

package br.com.pedropgaraujo.screenmatch.model;

public enum Categoria {

    ACAO("Action", "Ação"),
    ROMANCE("Romance", "Romance"),
    COMEDIA("Comedy", "Comédia"),
    DRAMA("Drama", "Drama"),
    CRIME("Crime", "Crime");

    private String categoriaOmdb;

    private String categoriaPortugues;

    Categoria(String categoriaOmdb, String categoriaPortugues){
        this.categoriaOmdb = categoriaOmdb;
        this.categoriaPortugues = categoriaPortugues;
    }

    public static Categoria fromPortugues(String text) {
        for (Categoria categoria : Categoria.values()) {
            if (categoria.categoriaPortugues.equalsIgnoreCase(text)) {
                return categoria;
            }
        }
        throw new IllegalArgumentException("Nenhuma categoria encontrada para a string fornecida: " + text);
    }
}

Na classe principal tem um menu usando switch case, que selecionando a opção 7, chama este metodo abaixo.

Principal.class

private void buscarSeriePorCategoria() {
        System.out.println("Deseja buscar séries de qual gênero?");
        var genderName = scan.nextLine();
        Categoria categoria = Categoria.fromPortugues(genderName);
        List<Serie> seriesPorCategoria = repository.finByGenero(categoria);
        System.out.println("Séries da categoria " + genderName);
        seriesPorCategoria.forEach(System.out::println);
    }
1 resposta
solução!

Depois de muito quebrar cabeça com este código, vi que o único erro era um erro de digitação, onde estava escrito "finByGenero" faltando a letra "d" no final da palavra Find.

Peço perdão pela ignorância kkkkkk

Pode finalizar o tópico.