Ao tentar agendar uma consulta me retorna este erro:
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!!!