Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
2
respuestas

[Duda] Query

Hola buenas tades, se puede usar est JPQL?

  @Query("SELECT d FROM Doctor d WHERE d.active = 1 AND d.speciality = :speciality AND d.id NOT in(SELECT q.doctor.id FROM Query q WHERE q.date = :date ORDER BY rand() LIMIT 1)")

creo que el valor ' ORDER BY rand() ' es para SQL

2 respuestas

¡Hola Christian, espero que estés bien!

Entiendo tu duda. Efectivamente, la expresión "ORDER BY rand()" que estás utilizando en tu consulta es específica de SQL y no es compatible con JPQL. En JPQL, para lograr el mismo efecto de seleccionar aleatoriamente un resultado, hacer de la siguiente manera:

Para seguir usando JPQL y lograr un resultado aleatorio, tendrás que modificar tu enfoque, ya que JPQL no tiene soporte directo para la función rand() ni permite seleccionar registros de forma aleatoria dentro de la consulta. Sin embargo, puedes manejar la aleatorización en tu lógica de negocio en lugar de hacerlo en la base de datos.

Aleatorización en el código Java: Una vez que obtengas la lista de doctores, puedes usar Collections.shuffle() para barajar la lista y seleccionar uno al azar.

List<Doctor> doctors = doctorRepository.findAvailableDoctors(speciality, date);
Collections.shuffle(doctors);
// Ahora puedes obtener un doctor aleatorio, por ejemplo:
Doctor randomDoctor = doctors.isEmpty() ? null : doctors.get(0);

Resumen

  • Ventaja: Puedes seguir usando JPQL y mantener la lógica de la consulta dentro de JPA.
  • Desventaja: La aleatorización ocurre en la aplicación, lo que podría ser menos eficiente si el conjunto de resultados es muy grande.

Este enfoque te permite usar JPQL y manejar la selección aleatoria en el nivel de aplicación.

Espero que esta solución te sea de ayuda. Si tienes alguna otra pregunta, no dudes en preguntar.

¡Espero haber ayudado y buenos estudios!

order by rand() funciona sin problemas. La gracia de JPQL es que permite escribir queries personalizadas aprovechando la orientación de objetos.

Yo hice la prueba así:

Creando la query en MedicoRepository

@Query("select m from Medico m order by rand() limit 1")
    Medico obtenerMedicoAleatorio();

y el endpoint en MedicoController:

@GetMapping("/aleatorio")
    @Transactional
    public Medico medicoAleatorio(){
        return medicoRepository.obtenerMedicoAleatorio();
    }