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

[Bug] Exception nas classes repository = Método findAtivoById

Olá! Me revirei bastante para tentar entender o que houve referente ao método findAtivoById, porém não consegui encontrar. Para contexto, no meu código o Professor seria o médico, e o Aluno o Paciente.

Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled.
2023-07-20T23:25:44.228-03:00 ERROR 22272 --- [  restartedMain] o.s.boot.SpringApplication               : Application run failed

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'alunosController': Unsatisfied dependency expressed through field 'repository': Error creating bean with name 'alunoRepository' defined in liga.cc.api.domain.aluno.AlunoRepository defined in @EnableJpaRepositories declared on JpaRepositoriesRegistrar.EnableJpaRepositoriesConfiguration: Could not create query for public abstract boolean liga.cc.api.domain.aluno.AlunoRepository.findAtivoById(java.lang.Long); Reason: Validation failed for query for method public abstract boolean liga.cc.api.domain.aluno.AlunoRepository.findAtivoById(java.lang.Long)

E aqui está dando erro no método da classe aluno, porém se eu comento o método da classe Aluno, o do professor passa a dar erro.


public interface AlunoRepository extends JpaRepository<Aluno, Long> {
    Page<Aluno> findAllByAtivoTrue(Pageable paginacao);



    @Query("select a.ativo from alunos a where a.id = :id")
    boolean findAtivoById(Long id);
}

public interface ProfessorRepository extends JpaRepository<Professor, Long> {
    Page<Professor> findAllByAtivoTrue(Pageable paginacao);

    @Query("""
            select p from professores
                where p.ativo = true 
                    and p.especialidade = :especialidade
                        and p.id not in(
                            select c.professor.id from aulas
                                where c.data = :data
                    )
                order by rand(
                limit 1
            """)
    Professor escolherProfessorAleatorioLivreNaData(Especialidade especialidade, LocalDateTime data);

    @Query("""
            select p.ativo from professores p where p.id = :id
            """)
    boolean findAtivoById(Long id); 

Antes de todas as alterações, o código estava funcionando 100%. Porém após as mudanças de validações, ele começou a apresentar este erro em específico.

3 respostas

No código do professor ele usa "Boolean" ao invés de "boolean". Das duas formas dá o mesmo erro.

solução!

Olá! Tudo bem? Acredito que o problema seja que você está se referindo não às entidades do banco de dados, mas sim às tabelas do banco de dados. Quando trabalhamos com o Spring Data Jpa, a sintaxe que usamos nas queries é um pouco diferente do SQL padrão, você precisa se referir usando o nome da entidade, aquele que colocamos na anotação @Entity, por exemplo:

@Table(name = "professores")
@Entity(name = "Professor")
@Getter
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(of = "id")
public class Professor {
    ...
}

Nesse caso, o nome que deve ser usado é Professor, as queries ficariam assim:

public interface ProfessorRepository extends JpaRepository<Professor, Long> {
    Page<Professor> findAllByAtivoTrue(Pageable paginacao);

    @Query("""
            select p from Professor p
                where p.ativo = true 
                    and p.especialidade = :especialidade
                        and p.id not in(
                            select c.professor.id from aulas
                                where c.data = :data
                    )
                order by rand(
                limit 1
            """)
    Professor escolherProfessorAleatorioLivreNaData(Especialidade especialidade, LocalDateTime data);

    @Query("""
            select p.ativo from Professor p where p.id = :id
            """)
    boolean findAtivoById(Long id); 

Se o nome da entidade for Aluno, a query ficará assim:

public interface AlunoRepository extends JpaRepository<Aluno, Long> {
    Page<Aluno> findAllByAtivoTrue(Pageable paginacao);



    @Query("select a.ativo from Aluno a where a.id = :id")
    boolean findAtivoById(Long id);
}

Mas se você quiser usar a sintaxe padrão do SQL, você pode fazer assim:

Assumindo que sua classe Aluno esteja anotada com @Table(name = "alunos"):

public interface AlunoRepository extends JpaRepository<Aluno, Long> {
    Page<Aluno> findAllByAtivoTrue(Pageable paginacao);



    @Query("select ativo from alunos where id = :id", nativeQuery = true)
    boolean findAtivoById(Long id);
}

Nesse caso, você diz para o Spring que se trata de uma query nativa, usando o padrão do SQL e não a sintaxe própria do Spring Data Jpa. Espero ter ajudado!

Boa cara! Não sabia dessa, e era exatamente este o erro! Muito obrigado!