3
respuestas

[Duda] Error starting ApplicationContext.

Me podrian ayudar a ver donde esta mi error , me sale lo siguiente: Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled. 2023-09-29T01:09:10.238-05:00 ERROR 7996 --- [ restartedMain] o.s.boot.SpringApplication : Application run failed

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'consultaController': Unsatisfied dependency expressed through field 'service': Error creating bean with name 'agendaDeConsultaService': Unsatisfied dependency expressed through field 'medicoRepository': Error creating bean with name 'medicoRepository' defined in med.voll.api.domain.medico.MedicoRepository defined in @EnableJpaRepositories declared on JpaRepositoriesRegistrar.EnableJpaRepositoriesConfiguration: Could not create query for public abstract med.voll.api.domain.medico.Medico med.voll.api.domain.medico.MedicoRepository.seleccionMedicoConEspecialidadenFecha(med.voll.api.domain.medico.Especialidad,java.time.LocalDateTime); Reason: Validation failed for query for method public abstract med.voll.api.domain.medico.Medico med.voll.api.domain.medico.MedicoRepository.seleccionMedicoConEspecialidadenFecha(med.voll.api.domain.medico.Especialidad,java.time.LocalDateTime) Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'agendaDeConsultaService': Unsatisfied dependency expressed through field 'medicoRepository': Error creating bean with name 'medicoRepository' defined in med.voll.api.domain.medico.MedicoRepository defined in @EnableJpaRepositories declared on JpaRepositoriesRegistrar.EnableJpaRepositoriesConfiguration: Could not create query for public abstract med.voll.api.domain.medico.Medico med.voll.api.domain.medico.MedicoRepository.seleccionMedicoConEspecialidadenFecha(med.voll.api.domain.medico.Especialidad,java.time.LocalDateTime); Reason: Validation failed for query for method public abstract med.voll.api.domain.medico.Medico

package med.voll.api.domain.medico;
.....
import java.time.LocalDateTime;
@Repository
public interface MedicoRepository extends JpaRepository<Medico, Long> {
    Page<Medico> findByActivoTrue(Pageable paginacion);
    @Query("""
            select m from Medico m 
            where m.activo = true
            and
            m.especialidad =: especialidad
            and
            m.id not in(
            select c.medico.id from Consulta c 
            where
            c.data =: fecha
            )            
            order by rand()
            limit 1;
            """)
    Medico seleccionMedicoConEspecialidadenFecha(Especialidad especialidad, LocalDateTime fecha);
       @Query("""select m.activo from Medico m where m.id =: id; """)
      Boolean findActivoById(Long id);
}
package med.voll.api.domain.consulta;
@Repository
public interface ConsultaRepository extends JpaRepository<Consulta, Long> {


    //Boolean
    Boolean existsByPacienteIdAndDataBetween(Long idMedico, LocalDateTime primerHorario, LocalDateTime ultimoHorario);

    Boolean existsByMedicoIdAndData(long l, LocalDateTime fecha);
}

package med.voll.api.domain.consulta;
...
import java.util.List;

@Service
public class AgendaDeConsultaService {
    @Autowired
    private MedicoRepository medicoRepository;
    @Autowired
    private ConsultaRepository consultaRepository;
    @Autowired
    List<ValidadorDeConsultas> validadores;
    public void agendar(DatosAgendarConsulta datos){

        if(!medicoRepository.findById(datos.idMedico()).isPresent()){
            throw new ValidacionDeIntegridad("Este id no ha sido encontrado");
        }

        if(datos.idMedico() != null && !medicoRepository.existsById(datos.idMedico())){
            throw new ValidacionDeIntegridad("Este Id para el medico no fue encontrado");
        }

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

        //var paciente = pacienteRepository.findById(datos.idPaciente()).get();

        var medico = seleccionarmedico(datos);

        if(medico==null){
            throw new ValidacionDeIntegridad("no existen medicos disponibles para este horario y especialidad");
        }

        var consulta = new Consulta(null, medico, datos.fecha());

        consultaRepository.save(consulta);

    }

    private Medico seleccionarmedico(DatosAgendarConsulta datos){
        if(datos.idMedico() != null){
            return medicoRepository.getReferenceById(datos.idMedico());
        }

        if(datos.especialidad() == null){
            throw new ValidacionDeIntegridad("Debe seleccionarse una especialidad por medico");
        }

        return medicoRepository.seleccionMedicoConEspecialidadenFecha(datos.especialidad(), datos.fecha());
    }
}
3 respuestas

Hola Laura,

Parece que hay un problema con la creación de la consulta en tu repositorio MedicoRepository. Según el error, la validación falló para el método seleccionMedicoConEspecialidadenFecha(Especialidad especialidad, LocalDateTime fecha).

La consulta parece estar bien estructurada, pero en la parte donde estás usando m.especialidad =: especialidad, asegúrate de que especialidad es un campo de la entidad Medico y que coincide con el tipo Especialidad que estás pasando como parámetro.

Además, la cláusula order by rand() y limit 1 no son compatibles con JPA. JPA no soporta estas funciones de SQL nativas en las consultas JPQL. Para lograr un resultado similar, podrías obtener todos los resultados y luego seleccionar uno al azar en tu servicio.

Por último, asegúrate de que estás pasando los parámetros correctos cuando llamas a este método desde tu servicio. Asegúrate de que datos.especialidad() y datos.fecha() están devolviendo los valores esperados.

Espero haber ayudado. Mucho éxito en todo lo que te propongas y si tienes alguna duda aquí estaremos para apoyarte.

¡Vamos juntos!

Si este post te ayudó, por favor, marca como solucionado ✓. Continúa con tus estudios

.....

Hola Laura, espero que lo hayas solucionado. De no ser así, te paso la solución que resultó en mi caso que estaba teniendo el mismo error. Tenés que realizar la query agregando un parámetro, de la siguiente manera:

@Query(value = """
            select m form Medico m
            where m.activo = true and m.especialidad=:especialidad and m.id 
            not in(select c.medico.id from Consulta c where c.fecha=:fecha)
            order by rand()
            limit 1
            """, nativeQuery = true)