Soy nuevo en el modo Hibernación y HQL. Quiero escribir una consulta de actualización en HQL, cuyo equivalente SQL es el siguiente:

update patient set 
      `last_name` = "new_last", 
      `first_name` = "new_first" 
where id = (select doctor_id from doctor 
            where clinic_id = 22 and city = 'abc_city');

doctor_id es PK para doctor y es FK y PK en patient. Hay uno-a-uno de mapeo.

Las correspondientes clases de Java se Paciente (con los campos apellidos, nombre, doctorId) y Doctor (con campos de doctorId).

Puede alguien por favor decirme lo que será el HQL equivalente de la anterior consulta SQL?

Muchas gracias.

OriginalEl autor Bhushan | 2011-03-04

4 Comentarios

  1. 12
    String update = "update Patient p set p.last_name = :new_last, p.first_name = :new_first where p.id = some (select doctor.id from Doctor doctor where doctor.clinic_id = 22 and city = 'abc_city')";

    Usted puede averiguar cómo frase consultas hql si marca la especificación. Usted puede encontrar una sección sobre subconsultas allí.

    :new_last y :new_first son ligaduras de variables, puede reemplazar los literales si usted desea..
    muchas gracias por la respuesta, así como para el enlace. yo tenia una duda . la consulta está trabajando bien, incluso sin la palabra «algunos». ¿cuál es la utilidad de eso? quiero decir, desde que no sé, he intentado de las dos formas (w/ y w/o), y funciona de la misma.
    Que es para que el id no es el único. Cuando la subconsulta devuelve varios resultados, es posible que desee para que coincida p.id a cualquiera de los resultados.

    OriginalEl autor mcyalcin

  2. 4

    No creo que usted necesita HQL (lo sé, te pedimos que, de forma explícita, pero ya que dices que estás de nuevo en un estado de Hibernación, permítanme ofrecer una Hibernación de estilo alternativo). Yo no soy un favor de HQL, porque todavía están lidiando con cadenas de caracteres, que puede llegar a ser difícil de mantener, como SQL, y se pierde la seguridad de tipos.

    En su lugar, utilice Hibernate consultas de criterios y método des para la consulta de sus datos. Dependiendo de su asignación de clase, se podría hacer algo como esto:

    List patients = session.CreateCriteria(typeof(Patient.class))         
        .createAlias("doctor", "dr")
              .add(Restrictions.Eq("dr.clinic_id", 22))
              .add(Restrictions.Eq("dr.city", "abc_city"))
        .list();
    
    //go through the patients and set the properties something like this:
    for(Patient p : patients)
    {
         p.lastName = "new lastname";
         p.firstName = "new firstname";
    }

    Algunas personas argumentan que el uso de CreateCriteria es difícil. Se tarda un poco en acostumbrarse, es cierto, pero que tiene la ventaja de la seguridad de tipos y complejidades que puede ser fácilmente escondido detrás de clases genéricas. Google para «Hibernate java GetByProperty» y verá lo que quiero decir.

    Muchas gracias Abel!
    eres bienvenido. Si te gusta, puede que el voto 😉
    hecho!!!!!!!!!!!!

    OriginalEl autor Abel

  3. 2
    update Patient set last_name = :new_last , first_name = :new_first where patient.id = some(select doctor_id from Doctor as doctor where clinic_id = 22 and city = abc_city)  
    Eso es correcto, echaba de menos el ‘algunos’. Aunque es de suponer que el id es único.
    muchas gracias por tu aportación. la consulta está trabajando bien, incluso sin la palabra «algunos». ¿cuál es la utilidad de eso? quiero decir, desde que no sé, he intentado de las dos formas (w/ y w/o), y funciona de la misma.

    OriginalEl autor yogsma

  4. 0

    Hay una diferencia significativa entre la ejecución de la actualización con seleccionar y en realidad la captura de los registros para el cliente, actualización y publicación de la espalda:

    UPDATE x SET a=:a WHERE b in (SELECT ...) 

    obras en la base de datos, los datos no se transfieren al cliente.

    list=CreateCriteria().add(Restriction).list();

    trae todos los registros para ser actualizado para el cliente, actualizaciones de ellos, a continuación, puestos de nuevo a la base de datos, probablemente con una ACTUALIZACIÓN por registro.

    Mediante la ACTUALIZACIÓN es mucho, mucho más rápido que el uso de criterios (creo que miles de veces).

    OriginalEl autor Krass

Dejar respuesta

Please enter your comment!
Please enter your name here