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

query did not return a unique result: 3

Ele está inicializando normal agora porém quando faço a requisição de agendar ele retorna: jakarta.persistence.NonUniqueResultException: query did not return a unique result: 3

{ "idPaciente": 3, "idMedico": 3, "data": "08/03/2024 13:45" }

projeto: https://github.com/Gustavo-AOliveira/gerenciamento-de-clinicas

5 respostas

Oi!

Manda a stacktrace completa. Tem alguma consulta que está devolvendo 3 registros, ao invés de um único.

jakarta.persistence.NonUniqueResultException: query did not return a unique result: 3 at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:128) ~[hibernate-core-6.1.7.Final.jar:6.1.7.Final] at org.hibernate.query.spi.AbstractSelectionQuery.getSingleResult(AbstractSelectionQuery.java:466) ~[hibernate-core-6.1.7.Final.jar:6.1.7.Final] at org.hibernate.query.sqm.internal.QuerySqmImpl.getSingleResult(QuerySqmImpl.java:1103) ~[hibernate-core-6.1.7.Final.jar:6.1.7.Final] at org.springframework.data.jpa.repository.query.JpaQueryExecution$SingleEntityExecution.doExecute(JpaQueryExecution.java:193) ~[spring-data-jpa-3.0.8.jar:3.0.8] at org.springframework.data.jpa.repository.query.JpaQueryExecution.execute(JpaQueryExecution.java:90) ~[spring-data-jpa-3.0.8.jar:3.0.8] at org.springframework.data.jpa.repository.query.AbstractJpaQuery.doExecute(AbstractJpaQuery.java:148) ~[spring-data-jpa-3.0.8.jar:3.0.8] at org.springframework.data.jpa.repository.query.AbstractJpaQuery.execute(AbstractJpaQuery.java:136) ~[spring-data-jpa-3.0.8.jar:3.0.8] at org.springframework.data.repository.core.support.RepositoryMethodInvoker.doInvoke(RepositoryMethodInvoker.java:136) ~[spring-data-commons-3.0.8.jar:3.0.8] at org.springframework.data.repository.core.support.RepositoryMethodInvoker.invoke(RepositoryMethodInvoker.java:120) ~[spring-data-commons-3.0.8.jar:3.0.8] at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.doInvoke(QueryExecutorMethodInterceptor.java:164) ~[spring-data-commons-3.0.8.jar:3.0.8] at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.invoke(QueryExecutorMethodInterceptor.java:143) ~[spring-data-commons-3.0.8.jar:3.0.8] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) ~[spring-aop-6.0.11.jar:6.0.11] at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:72) ~[spring-data-commons-3.0.8.jar:3.0.8] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) ~[spring-aop-6.0.11.jar:6.0.11] at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:123) ~[spring-tx-6.0.11.jar:6.0.11] at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:391) ~[spring-tx-6.0.11.jar:6.0.11] at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) ~[spring-tx-6.0.11.jar:6.0.11] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) ~[spring-aop-6.0.11.jar:6.0.11] at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137) ~[spring-tx-6.0.11.jar:6.0.11] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) ~[spring-aop-6.0.11.jar:6.0.11] at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:135) ~[spring-data-jpa-3.0.8.jar:3.0.8] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) ~[spring-aop-6.0.11.jar:6.0.11] at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97) ~[spring-aop-6.0.11.jar:6.0.11] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) ~[spring-aop-6.0.11.jar:6.0.11] at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:244) ~[spring-aop-6.0.11.jar:6.0.11] at jdk.proxy4/jdk.proxy4.$Proxy130.findAtivoById(Unknown Source) ~[na:na] at med.voll.api.domain.Consulta.Validations.ValidadorPacienteAtivo.validar(ValidadorPacienteAtivo.java:16) ~[classes/:na] at med.voll.api.services.ConsultaService.lambda$agendar$0(ConsultaService.java:40) ~[classes/:na] at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) ~[na:na] at med.voll.api.services.ConsultaService.agendar(ConsultaService.java:40) ~[classes/:na] at med.voll.api.controller.ConsultaController.agendar(ConsultaController.java:26) ~[classes/:na] at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104) ~[na:na] at java.base/java.lang.reflect.Method.invoke(Method.java:578) ~[na:na] at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205) ~[spring-web-6.0.11.jar:6.0.11]

O problema está nesse seu método do PacienteRepository:

@Query("""
        select p.ativo
        from Paciente p
        where
        p.id = id
        """)
boolean findAtivoById(Long id);

Na ṕultima linha da query era para ser: p.id = :id (faltou os dois pontos antes do id)

Agora está dando um erro de lógica:

Quando eu faço a requisição sem passar um médico ele faz tudo certinho:

Requisição

{
    "idPaciente": 2,
    "especialidade": "ORTOPEDIA",
    "data": "20/03/2024 16:00"
}
Code: 200 OK
retorno:
{
    "id": 4,
    "idMedico": 3,
    "idPaciente": 2,
    "data": "2024-03-20T16:00:00"
}

Porém quando eu passo um id de um médico, ele pede a especialidade porém não deveria:

Requisição: 
{
    "idPaciente": 3,
    "idMedico": 6,
    "data": "23/03/2024 12:00"
}
Code: 400 bad request
Retorno: 
{
    "httpStatus": "BAD_REQUEST",
    "message": "Adicione a especialidade"
}

E se caso eu passar a especialidade(Algo que não deveria acontecer) ele marca porém com um médico aleatório:

Requisição:
{
    "idPaciente": 3,
    "especialidade": "ORTOPEDIA",
    "idMedico": 6,
    "data": "30/03/2024 12:00"
}
Code: 200 OK
Retorno:
{
    "id": 7,
    "idMedico": 3,
    "idPaciente": 3,
    "data": "2024-03-30T12:00:00"
}

Projeto: https://github.com/Gustavo-AOliveira/gerenciamento-de-clinicas

solução!

Nesse seu método:

private Medico randomMedico(DadosAgendamentoConsulta data) {
    if(data.idMedico() != null){
        medicoRepository.getReferenceById(data.idMedico());
    }
    if(data.especialidade() == null){
        throw new ValidationException("Adicione a especialidade");
    }
        return medicoRepository.randomMedicoDisponivel(data.especialidade(), data.data());
}

Faltou o return no primeiro if e por isso ele está senguindo o fluxo do método, sendo que já deveria retornar o médico encontrado.