Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
1
respuesta

[Duda] Problemas al compilar la clase MedicoRepository

Buenas tarde

Cuando trato de compilar me da este error en la clase MedicoRepository del curso Spring Boot 3: documentar, probar y preparar una API para su implementación y me tiene muy atrasado, le he dado muchas vueltas y no encuentro la cauisa:

package med.voll.api.domain.medico;

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;

import java.time.LocalDateTime;

public interface MedicoRepository extends JpaRepository<Medico, Long> {
Page findByActivoTrue(Pageable paginacion);

@Query("""
        select m from Medico m
        where
        m.activo = 1
        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
        """)
Medico elegirMedicoAleatorioDisponibleEnLaFecha(Especialidad especialidad, LocalDateTime fecha);

}

Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled.
2026-01-02T17:27:24.328-03:00 ERROR 14460 --- [ restartedMain] o.s.boot.SpringApplication : Application run failed

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'consultaController': Unsatisfied dependency expressed through field 'reserva': Error creating bean with name 'reservaDeConsultas': 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.elegirMedicoAleatorioDisponibleEnLaFecha(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.elegirMedicoAleatorioDisponibleEnLaFecha(med.voll.api.domain.medico.Especialidad,java.time.LocalDateTime)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:787) ~[spring-beans-6.1.8.jar:6.1.8]
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:767) ~[spring-beans-6.1.8.jar:6.1.8]
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:145) ~[spring-beans-6.1.8.jar:6.1.8]
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:508) ~[spring-beans-6.1.8.jar:6.1.8]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1421) ~[spring-beans-6.1.8.jar:6.1.8]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:599) ~[spring-beans-6.1.8.jar:6.1.8]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:522) ~[spring-beans-6.1.8.jar:6.1.8]
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:337) ~[spring-beans-6.1.8.jar:6.1.8]
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-6.1.8.jar:6.1.8]
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:335) ~[spring-beans-6.1.8.jar:6.1.8]
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200) ~[spring-beans-6.1.8.jar:6.1.8]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:975) ~[spring-beans-6.1.8.jar:6.1.8]
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:962) ~[spring-

por favor me ayudan para poder avanzar
1 respuesta

Hola Santiago,

Entiendo lo frustrante que puede ser enfrentarse a un error de compilación, especialmente cuando parece que todo debería estar funcionando. El error que estás viendo parece estar relacionado con la consulta que has definido en el método elegirMedicoAleatorioDisponibleEnLaFecha de tu MedicoRepository.

El problema podría deberse a la forma en que has escrito la consulta. Aquí hay algunas cosas que podrías verificar o intentar:

  1. Sintaxis de la consulta: Asegúrate de que la sintaxis de tu consulta JPQL sea correcta. Por ejemplo, la función rand() y limit no son parte del estándar JPQL. Si estás utilizando una base de datos específica que soporta estas funciones, verifica que la sintaxis sea compatible.

  2. Parámetros de la consulta: Asegúrate de que los nombres de los parámetros en la consulta (:especialidad y :fecha) coincidan exactamente con los nombres de los parámetros en el método.

  3. Tipos de datos: Verifica que los tipos de datos de los parámetros (Especialidad y LocalDateTime) sean compatibles con los campos correspondientes en la entidad Medico.

  4. Errores de compilación previos: A veces, un error de compilación puede ser causado por un problema en otra parte del código. Asegúrate de que todas las clases y configuraciones relacionadas estén correctamente definidas y sin errores.

  5. Habilitar el modo de depuración: Como sugiere el mensaje de error, intenta ejecutar tu aplicación con el modo de depuración habilitado para obtener más detalles sobre el problema.

Aquí tienes un ejemplo de cómo podría ser una consulta JPQL simplificada:

@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.fecha = :fecha)")
Medico elegirMedicoAleatorioDisponibleEnLaFecha(Especialidad especialidad, LocalDateTime fecha);

Espero que estas sugerencias te sean útiles para resolver el problema. ¡Buena suerte con tu proyecto!

Espero haber ayudado y buenos estudios!