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

Regras de negócios - agendamento - erro

Neste modulo 3 Spring boot com regras de negóio estou com erro no agendamento retornar mais de um resultado. Não identifiquei ainda o problema.

Hibernate: select p1_0.ativo from pacientes p1_0 where p1_0.id=p1_0.id 2024-07-04T11:07:25.525-03:00 ERROR 14516 --- [api] [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.dao.IncorrectResultSizeDataAccessException: Query did not return a unique result: 8 results were returned] with root cause

org.hibernate.NonUniqueResultException: Query did not return a unique result: 8 results were returned at org.hibernate.query.spi.AbstractSelectionQuery.uniqueElement(AbstractSelectionQuery.java:578) ~[hibernate-core-6.5.2.Final.jar:6.5.2.Final] Insira aqui a descrição dessa imagem para ajudar na acessibilidade

6 respostas

Oi!

Manda aqui o código da sua classe service.

opa, Rodrigo..

package med.voll.api.domain.consulta;

import jakarta.validation.ValidationException; import med.voll.api.domain.ValidacaoException; import med.voll.api.domain.consulta.validacoes.ValidadorAgendamentoDeConsulta; import med.voll.api.domain.medico.Medico; import med.voll.api.domain.medico.MedicoRepository; import med.voll.api.domain.paciente.PacienteRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service;

import java.util.List;

@Service public class AgendaDeConsulta {

@Autowired
private ConsultaRepository consultaRepository;

@Autowired
private MedicoRepository medicoRepository;

@Autowired
private PacienteRepository pacienteRepository;

@Autowired
private List<ValidadorAgendamentoDeConsulta> validadores;

public DadosDetalhamentoConsulta agendar(DadosAgendamentoConsulta dados){

    if (!pacienteRepository.existsById(dados.idPaciente())){
        throw new ValidationException("Id do paciente informado não existe!");
    }

    if (dados.idMedico() != null && !medicoRepository.existsById(dados.idMedico())){
        throw new ValidationException("Id do médico informado não existe!");
    }

    validadores.forEach(v -> v.validar(dados));

    var paciente = pacienteRepository.getReferenceById(dados.idPaciente());

    //var medico = medicoRepository.findById(dados.idMedico()).get();

    var medico = escolherMedico(dados);

    var consulta = new Consulta(null, medico, paciente, dados.data(), null);

    consultaRepository.save(consulta);

    return new DadosDetalhamentoConsulta(consulta);

}

private Medico escolherMedico(DadosAgendamentoConsulta dados) {

    if (dados.idMedico() != null) {
        return medicoRepository.getReferenceById(dados.idMedico());
    }

    if (dados.especialidade() == null) {

        throw new ValidacaoException("Especilidade é obritatória quando médico não for escolhido!");
    }

    return medicoRepository.escolherMedicoAleatorioLivreNaData(dados.especialidade(), dados.data());

}

public void cancelar(DadosCancelamentoConsulta dados) {

    if (!consultaRepository.existsById(dados.idConsulta())) {

        throw new ValidationException("Id da consulta informado não existe!");
    }

    var consulta = consultaRepository.getReferenceById(dados.idConsulta());

    consulta.cancelar(dados.motivo());


}

}

Pelo erro, parece que no seu banco de dados tem médico ou paciente com id duplicado. Confere isso nas tabelas.

Rodrigo... olhei o bando de dados não tem duplicação de id para pacientes ou médico. Criada uma branch parte de regra de negócios e refiz aulas. O projeto com erro no git no erro: https://github.com/lfabianocf/spring-boot-3-2271

Chego no mesmo erro e um detalhe no teste com insomia algumas consultas não retorna menagem no insomia (403 - forbiden) apenas no console. Insira aqui a descrição dessa imagem para ajudar na acessibilidade Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Baixei o seu projeto e aqui funcionou normalmente.

Dá uma conferida na sua interface PacienteRepository, no método finAtivoById, se a query está assim:

select p.ativo
        from Paciente p
        where
        p.id = :id

Confere se o parâmetro id está com os dois pontos (p.id = :id), pois a exception no seu caso está acontecendo na chamada desse método, que está devolvendo 8 registros ao invés de 1, e na sua tabela de pacientes tem exatamente 8 registros.

solução!

Pela dica que vc informou encontrei dois erro:

Em PacienteRepository o JPQL (fin) finAtivoById corrigido : findAtivoById. O sql estava certo.

Em MedicoRepository sem os dois pontos :id select m.ativo from Medico m where m.id = id

vlw..