Ao tentar agendar uma consulta me retorna este erro:
Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!
Ao tentar agendar uma consulta me retorna este erro:
Oi Maessio!
Posta o texto do erro aqui, pois saiu cortado na imagem.
2023-06-13T15:16:11.742-03:00 ERROR 18268 --- [nio-8080-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: org.springframework.orm.jpa.JpaSystemException: Specified result type [boolean] did not match Query selection type [med.voll.api.domain.consulta.Consulta] - multiple selections: use Tuple or array] with root cause
org.hibernate.query.QueryTypeMismatchException: Specified result type [boolean] did not match Query selection type [med.voll.api.domain.consulta.Consulta] - multiple selections: use Tuple or array
Parece ser erro na consulta sql. Posta aqui o código da sua interface MedicoRepository
Está tudo certo com o código. Deve ter registros duplicados no seu banco de dados então, que foram inseridos como teste antes de realizar as validações.
Apaga as consultas do seu banco de dados:
delete from consultas;
Tabela de consultas já esta vazia
Estranho. O erro acontece ao chamar o método existsByMedicoIdAndData da interface ConsultaRepository:
boolean existsByMedicoIdAndData(Long idMedico, LocalDateTime data);
Sendo que esse método é chamado nessa classe de validação:
@Component
public class ValidadorMedicoComOutraConsultaNoMesmoHorario implements ValidadorAgendamentoDeConsulta {
@Autowired
private ConsultaRepository repository;
public void validar(DadosAgendamentoConsulta dados) {
var medicoPossuiOutraConsultaNoMesmoHorario = repository.existsByMedicoIdAndData(dados.idMedico(), dados.data());
if (medicoPossuiOutraConsultaNoMesmoHorario) {
throw new ValidacaoException("Médico já possui outra consulta agendada nesse mesmo horário");
}
}
}
E a princípio somente aconteceria esse erro caso o médico tivesse mais de uma consulta nessa mesma data.
Verifiquei tanto a interface ConsultaRepository quanto a classe de validação e estão ambos corretas.
Faz um teste então, coloca um try/catch no validador, só para ter certeza que a exceção está ocorrendo nesse ponto do código mesmo:
public void validar(DadosAgendamentoConsulta dados) {
try {
var medicoPossuiOutraConsultaNoMesmoHorario = repository.existsByMedicoIdAndData(dados.idMedico(), dados.data());
if (medicoPossuiOutraConsultaNoMesmoHorario) {
throw new ValidacaoException("Médico já possui outra consulta agendada nesse mesmo horário");
}
} catch(Exception e) {
System.out.println("Erro!");
e.printStackTrace();
}
}
Veja se ocorre o erro no console e posta aqui a saída do console.
Mesmo erro: 2023-06-13T16:30:43.841-03:00 ERROR 1076 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: org.springframework.orm.jpa.JpaSystemException: Specified result type [boolean] did not match Query selection type [med.voll.api.domain.consulta.Consulta] - multiple selections: use Tuple or array] with root cause
Não passou pelo try/catch.
Hum, então é outro local.
Coloca o try/catch no método agendar da classe AgendaDeConsultas:
public DadosDetalhamentoConsulta agendar(DadosAgendamentoConsulta dados) {
try {
if (!pacienteRepository.existsById(dados.idPaciente())) {
throw new ValidacaoException("Id do paciente informado não existe!");
}
if (dados.idMedico() != null && !medicoRepository.existsById(dados.idMedico())) {
throw new ValidacaoException("Id do médico informado não existe!");
}
validadores.forEach(v -> v.validar(dados));
var paciente = pacienteRepository.getReferenceById(dados.idPaciente());
var medico = escolherMedico(dados);
if (medico == null) {
throw new ValidacaoException("Não existe médico disponível nessa data!");
}
var consulta = new Consulta(null, medico, paciente, dados.data(), null);
consultaRepository.save(consulta);
return new DadosDetalhamentoConsulta(consulta);
} catch(Exception e) {
System.out.println("Erro!");
e.printStackTrace();
return null;
}
}
Retornou
cola aqui a exception inteira
Erro!
org.springframework.orm.jpa.JpaSystemException: Specified result type [boolean] did not match Query selection type [med.voll.api.domain.consulta.Consulta] - multiple selections: use Tuple or array
at org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException(HibernateJpaDialect.java:320)
at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:232)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:550)
at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:61)
at org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:242)
at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:152)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184)
at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:134)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:223)
at jdk.proxy4/jdk.proxy4.$Proxy136.findAtivoById(Unknown Source)
at med.voll.api.domain.consulta.Validacoes.ValidadorPacienteAtivo.validar(ValidadorPacienteAtivo.java:16)
at med.voll.api.domain.consulta.AgendaDeConsultas.lambda$agendar$0(AgendaDeConsultas.java:44)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
at med.voll.api.domain.consulta.AgendaDeConsultas.agendar(AgendaDeConsultas.java:44)
at med.voll.api.controller.ConsultaController.agendar(ConsultaController.java:26)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:568)
Ah o problema está aqui na verdade:
at med.voll.api.domain.consulta.Validacoes.ValidadorPacienteAtivo.validar(ValidadorPacienteAtivo.java:16)
Manda aqui suas classes ValidadorPacienteAtivo e também PacienteRepository
O problema está na sua classe ValidadorPacienteAtivo. Você injetou nela o ConsultaRepository ao invés do PacienteRepository
Deu certo! Muito obrigado!!!