Gracias por compartir tu clase MedicoRepository. El problema principal está en este fragmento del @Query que estás usando con JPQL:
java Copiar código @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 ) order by rand() limit 1 """) Medico seleccionarMedicoConEspecialidadEnFecha(Especialidad especialidad, LocalDateTime fecha); Problemas: limit 1 y order by rand() no son válidos en JPQL:
JPQL (Java Persistence Query Language) no soporta limit ni order by rand() porque es un lenguaje abstracto independiente del motor de base de datos.
Estas cláusulas son propias de SQL nativo (por ejemplo, en MySQL sí están permitidas).
Soluciones: Opción 1: Usa Pageable en lugar de limit (recomendado para JPQL) Spring Data JPA permite pasar un Pageable al método, y así puedes limitar a un solo resultado sin usar limit ni rand().
java Copiar código @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 ) """) List seleccionarMedicosDisponibles(Especialidad especialidad, LocalDateTime fecha, Pageable pageable); Y luego en tu servicio, haces algo como:
java Copiar código var medicos = medicoRepository.seleccionarMedicosDisponibles(especialidad, fecha, PageRequest.of(0, 1)); if (medicos.isEmpty()) return null; return medicos.get(0); Opción 2: Usa SQL nativo (solo si necesitas rand()) java Copiar código @Query(value = """ SELECT * FROM medicos m WHERE m.activo = true AND m.especialidad = :especialidad AND m.id NOT IN ( SELECT c.medico_id FROM consultas c WHERE c.fecha = :fecha ) ORDER BY RAND() LIMIT 1 """, nativeQuery = true) Medico seleccionarMedicoConEspecialidadEnFecha(Especialidad especialidad,