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

Retornando erro "2023-06-13T11:31:39.779-03:00 ERROR 6744"

Ao tentar agendar uma consulta me retorna este erro: Insira aqui a descrição dessa imagem para ajudar na acessibilidade

18 respostas

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

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

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 Insira aqui a descrição dessa imagem para ajudar na acessibilidade

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 Insira aqui a descrição dessa imagem para ajudar na acessibilidade

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

Insira aqui a descrição dessa imagem para ajudar na acessibilidade Insira aqui a descrição dessa imagem para ajudar na acessibilidade

solução!

O problema está na sua classe ValidadorPacienteAtivo. Você injetou nela o ConsultaRepository ao invés do PacienteRepository

Deu certo! Muito obrigado!!!