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

Query com bug...

Pessoas, boa tarde!

Estou já a um bom tempo enfrentando um problema que, de verdade, não sei mais o que faço...


```Meu projeto estava rodando normalmente, mas, de pois que montei esta bendita query, não está funcionando mais.
Vou colocar um trecho do erro apresentado no console.

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'aulasController': Unsatisfied dependency expressed through field 'agenda': Error creating bean with name 'agendamentoDeAulas': Unsatisfied dependency expressed through field 'professorRepository': Error creating bean with name 'professorRepository' defined in br.com.compreender.entender.ler.escola.api_rest.domain.professor.ProfessorRepository defined in @EnableJpaRepositories declared on JpaRepositoriesRegistrar.EnableJpaRepositoriesConfiguration: Could not create query for public abstract br.com.compreender.entender.ler.escola.api_rest.domain.professor.ProfessorEntity br.com.compreender.entender.ler.escola.api_rest.domain.professor.ProfessorRepository.escolherProfessorEntityAleatorioLivreNaData(br.com.compreender.entender.ler.escola.api_rest.domain.professor.Especialidade,java.time.LocalDateTime); Reason: Validation failed for query for method public abstract br.com.compreender.entender.ler.escola.api_rest.domain.professor.ProfessorEntity br.com.compreender.entender.ler.escola.api_rest.domain.professor.ProfessorRepository.escolherProfessorEntityAleatorioLivreNaData(br.com.compreender.entender.ler.escola.api_rest.domain.professor.Especialidade,java.time.LocalDateTime)
    
5 respostas

Oi!

Manda aqui o código da sua interface Repository e da sua entidade também.

package br.com.compreender.entender.ler.escola.api_rest.domain.aulas;

import br.com.compreender.entender.ler.escola.api_rest.domain.alunos.AlunoEntity; import br.com.compreender.entender.ler.escola.api_rest.domain.professor.ProfessorEntity; import jakarta.persistence.*; import lombok.AllArgsConstructor; import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.NoArgsConstructor;

import java.time.LocalDateTime;

@Getter @Table(name = "aulas") @Entity(name = "AulaEntity") @NoArgsConstructor @AllArgsConstructor @EqualsAndHashCode(of = "id") public class AulaEntity {

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

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "professor_id")
private ProfessorEntity professor;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "aluno_id")
private AlunoEntity aluno;

private LocalDateTime data;

@Column(name = "motivo_cancelamento")
@Enumerated(EnumType.STRING)
private MotivoDoCancelamento motivoDoCancelamento;


public void cancelar(MotivoDoCancelamento motivo) {
    this.motivoDoCancelamento = motivo;
}

}

package br.com.compreender.entender.ler.escola.api_rest.domain.professor;

import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query;

import java.time.LocalDateTime;

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

@Query("""
        select m from ProfessorEntity p
        where
        p.ativo = true
        and
        p.especialidade = :especialidade
        and
        p.id not in(
        select a.professor.id from AulaEntity a
        where
        a.data = :data
        )
        order by rand()
        limit 1
        """)
ProfessorEntity escolherProfessorEntityAleatorioLivreNaData(Especialidade especialidade, LocalDateTime data);

} package br.com.compreender.entender.ler.escola.api_rest.domain.professor;

import br.com.compreender.entender.ler.escola.api_rest.domain.endereco.Endereco; import jakarta.persistence.*; import lombok.AllArgsConstructor; import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.NoArgsConstructor;

@Getter @Table(name = "professores") @Entity(name = "ProfessorEntity") @NoArgsConstructor @AllArgsConstructor @EqualsAndHashCode(of = "id") public class ProfessorEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private Boolean ativo; private String nome; private String email; private String telefone; private String celular; private String matricula; @Enumerated(EnumType.STRING) private Especialidade especialidade; private String rg; private String cpf; @Embedded private Endereco endereco;

public ProfessorEntity(DadosDeCadastroDoProfessor dados) {
    this.ativo = true;
    this.nome = dados.nome();
    this.email = dados.email();
    this.telefone = dados.telefone();
    this.celular = dados.celular();
    this.matricula = dados.matricula();
    this.especialidade = dados.especialidade();
    this.rg = dados.rg();
    this.cpf = dados.cpf();
    this.endereco = new Endereco(dados.endereco());
}

public void atualizarInformacoes(DadosDeAtualizacaoDoProfessor dados) {
    if (dados.nome() != null) {
        this.nome = dados.nome();
    }
    if (dados.email() != null) {
        this.email = dados.email();
    }
    if (dados.telefone() != null) {
        this.telefone = dados.telefone();
    }
    if (dados.rg() != null) {
        this.rg = dados.rg();
    }

    if (dados.dados() != null) {
        this.endereco.atualizarInformacoes(dados.dados());
    }
}

public void inativarCadastro() {
    this.ativo = false;
}

public void ativarCadastro() {
    if (this.ativo == false) {
        this.ativo = true;
    }

}

}

Professor, só lhe explicando algo que já deva ter percebido, é que, no lugar de uma clínica médica, criei uma API de uma escola. E, no lugar de uma entidade de médico é professor, e, no lugar do paciente, criei a entidade aluno.

Mas, segue mais ou menos a mesma lógica.

solução!

Na sua query:

select m from ProfessorEntity p

Deveria ser p e não m:

select p from ProfessorEntity p

Veja se era esse o problema.

Caramba profe... Sensacional! Deu super certo. Muitíssimo obrigado.