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

[Bug] @Query com erro.

Boa noite pessoal! Já apareci por aqui nestes dias com uma dúvida um tanto parecida, mas, era num projeto um pouco diferente mas, seguindo a mesma lógica. Ao criar o método "escolherMedicoAleatorioLivreNaData" e, anotá-lo com o @Query, meu projeto não está rodando mais, e, apresenta o seguinte mensagem no console: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'consultaController': Unsatisfied dependency expressed through field 'agenda': Error creating bean with name 'agendaDeConsultas': Unsatisfied dependency expressed through field 'medicoRepository': Error creating bean with name 'medicoRepository' defined in br.com.med.voll.clinica.api_rest.domain.medicos.MedicoRepository defined in @EnableJpaRepositories declared on JpaRepositoriesRegistrar.EnableJpaRepositoriesConfiguration: Could not create query for public abstract br.com.med.voll.clinica.api_rest.domain.medicos.MedicoEntity br.com.med.voll.clinica.api_rest.domain.medicos.MedicoRepository.escolherMedicoAleatorioLivreNaData(br.com.med.voll.clinica.api_rest.domain.medicos.Especialidade,java.time.LocalDateTime); Reason: Validation failed for query for method public abstract br.com.med.voll.clinica.api_rest.domain.medicos.MedicoEntity br.com.med.voll.clinica.api_rest.domain.medicos.MedicoRepository.escolherMedicoAleatorioLivreNaData(br.com.med.voll.clinica.api_rest.domain.medic``os.Especialidade,java.time.LocalDateTime)

package br.com.med.voll.clinica.api_rest.domain.medicos;

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 MedicoRepository extends JpaRepository<MedicoEntity, Long> { Page findAllByAtivoTrue(Pageable paginacao);

@Query("""
        select m from MedicoEntity m
        where
        m.ativo = true
        and
        m.especialidade = :especialidade
        and
        m.id not in(
        select c.medico.id from ConsultaEntity c
        where
        c.data = :data
        
        )
        order by rand()
        limit 1
        """)
MedicoEntity escolherMedicoAleatorioLivreNaData(Especialidade especialidade, LocalDateTime data);

}

5 respostas

Eu mandei o código do "MedicoRepository", e, ficou meio bagunçado, mas, acho que da pra entender!

Oi!

A query está ok. Então se está com problemas, pode ser por conta de algum atributo na query não estar batendo com os atributos das entidades. Manda aqui o código das suas classes Medico e Consulta.

Oi Profe Rodrigo, segue abaixo:

package br.com.med.voll.clinica.api_rest.domain.medicos;

import br.com.med.voll.clinica.api_rest.domain.endereco.Endereco;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Table(name = "medicos")
@Entity(name = "MedicoEntity")
@Getter
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(of = "id")
public class MedicoEntity {
    @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 corporativo;
    private String crm;
    @Enumerated(EnumType.STRING)
    private Especialidade especialidade;
    private String rg;
    private String cpf;
    @Embedded
    private Endereco endereco;

    public MedicoEntity(DadosDeCadastroDeMedico dados) {
        this.ativo = true;
        this.nome = dados.nome();
        this.email = dados.email();
        this.telefone = dados.telefone();
        this.celular = dados.celular();
        this.corporativo = dados.corporativo();
        this.crm = dados.crm();
        this.especialidade = dados.especialidade();
        this.rg = dados.rg();
        this.cpf = dados.cpf();
        this.endereco = new Endereco(dados.endereco());
    }

    public void atualizarCadastro(DadosDeAtualizacaoDoMedico 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.corporativo() != null) {
            this.corporativo = dados.corporativo();
        }
        if (dados.rg() != null) {
            this.rg = dados.rg();
        }
        if (dados.endereco() != null) {
            this.endereco.atualizarInformacoes(dados.endereco());
        }
    }

    public void inativarMedico() {
        this.ativo = false;
    }
}
package br.com.med.voll.clinica.api_rest.domain.consultas;

import br.com.med.voll.clinica.api_rest.domain.medicos.MedicoEntity;
import br.com.med.voll.clinica.api_rest.domain.pacientes.PacienteEntity;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.NoArgsConstructor;

import java.time.LocalDateTime;

@Table(name = "consultas")
@Entity(name = "ConsultaEntity")
@Getter
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(of = "id")
public class ConsultaEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "medico_id")
    private MedicoEntity medicoEntity;
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "paciente_id")
    private PacienteEntity pacienteEntity;

    private LocalDateTime data;

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

    public void cancelar(MotivoDoCancelamento motivo) {
        this.motivo = motivo;
    }
}
solução!

Na sua classe ConsultaEntity o atributo do médico se chama medicoEntity e não medico, então na sua query esse trecho está errado:

select c.medico.id from ConsultaEntity c

Deveria ser:

select c.medicoEntity.id from ConsultaEntity c

Opa, funcionou corretamente profe!!! Mais uma vez, muito obrigado pela ajuda e atenção.