Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Solucionado (ver solución)
Solucionado
(ver solución)
2
respuestas

actividad 04 aplicando SOLID

Hola en la actividad segui todo lo dicho por el instructor pero salta este error a la hora de levantar la aplicacion, creo que marca un error en la consulta de medicoRepository pero lo copie igual del repositorio git de la clase y aun asi sigue el error

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'consultaController': Unsatisfied dependency expressed through field 'agendaConsultaService': Error creating bean with name 'agendaConsultaService': 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.seleccionarMedicoEspecialidadFecha(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.seleccionarMedicoEspecialidadFecha(med.voll.api.domain.medico.Especialidad,java.time.LocalDateTime)

this may indicate a semantic (user query) problem or a bug in the parser [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
]

medicoRepository

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 org.springframework.stereotype.Repository;

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= 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 seleccionarMedicoEspecialidadFecha(Especialidad especialidad, LocalDateTime fecha);


    @Query("""
            select m.activo 
            from Medico m
            where m.id=:idMedico
            """)
    Boolean findActivoById(Long idMedico);
}
2 respuestas

Hola Alonso,

El error generalmente ocurre cuando Spring Data JPA no puede crear una consulta a partir del método que has definido en tu interfaz de repositorio.

En tu caso, parece que el problema está relacionado con la consulta seleccionarMedicoEspecialidadFecha en tu interfaz MedicoRepository. La consulta parece estar bien formada a primera vista, pero hay algunas cosas que podrías revisar:

  1. Asegúrate de que la entidad Medico esté correctamente mapeada y que todas las propiedades a las que te refieres en tu consulta (como activo, especialidad, id) existan en esa entidad.

  2. La función rand() y limit no son soportadas en JPA. JPA no soporta todas las funciones de SQL y rand() y limit son dos de ellas. Para solucionar este problema, podrías tener que reescribir tu consulta para que no dependa de estas funciones, o podrías tener que recurrir a una consulta nativa SQL.

  3. Asegúrate de que los parámetros de tu consulta (:especialidad y :fecha) estén siendo pasados correctamente cuando llamas a este método.

Por ejemplo, si Especialidad es una entidad, necesitarías asegurarte de que estás pasando una instancia de Especialidad existente. Si fecha es un LocalDateTime, necesitarías asegurarte de que estás pasando un LocalDateTime válido.

Espero que estas sugerencias te ayuden a resolver tu problema. Recuerda que la depuración es una parte normal del desarrollo y cada error es una oportunidad para aprender algo nuevo. Mucho éxito en todo lo que te propongas y si tienes más duda aquí estaremos para apoyarte.

¡Vamos juntos!

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

Buen dia Adriana, gracias por su oportuna respuesta... todos los parámetros estaban bien el problema radica en que la funcion rand() en jpa parece ser random(). dejo el codigo, Saludos

   @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 random() limit 1
           """)
    Medico seleccionarMedicoEspecialidadFecha(Especialidad especialidad, LocalDateTime fecha);