Frage Wie konvertiert man verschachtelte SQL nach HQL


Ich bin neu im Hibernate und HQL. Ich möchte eine Aktualisierungsabfrage in HQL schreiben, deren SQL-Entsprechung wie folgt lautet:

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 ist PK für doctor und ist FK und PK in patient. Es gibt eine Eins-zu-Eins-Zuordnung.

Die entsprechenden Java-Klassen sind Patient (mit Feldern lastName, firstName, doctorId) und Doctor (mit Feldern doctorId).

Kann mir bitte jemand sagen, was das HQL-Äquivalent der obigen SQL-Abfrage sein wird?

Danke vielmals.


12
2018-03-04 20:01


Ursprung


Antworten:


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')";

Sie können herausfinden, wie Sie HQL-Abfragen formulieren, wenn Sie das Häkchen setzen Spezifikation. Sie können einen Abschnitt über finden Unterabfragen Dort.


12
2018-03-04 20:10



Ich glaube nicht, dass du HQL brauchst (ich weiß, du fragst das explizit, aber da du sagst, dass du neu bei Hibernate bist, lass mich eine Alternative im Hibernate-Stil anbieten). Ich bin kein Gefallen von HQL, weil Sie immer noch mit Strings arbeiten, die schwer zu pflegen sind, genau wie SQL, und Sie verlieren die Typensicherheit.

Verwenden Sie stattdessen Hibernate-Kriterien Abfragen und Methodes, um Ihre Daten abzufragen. Je nach Klassenzuordnung könnten Sie Folgendes tun:

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";
}

Einige Leute argumentieren, dass die Verwendung von CreateCriteria schwierig ist. Es ist ein wenig gewöhnungsbedürftig, stimmt, aber es hat den Vorteil, dass Sicherheit und Komplexität leicht hinter generischen Klassen versteckt werden können. Google für "Hibernate Java GetByProperty" und Sie sehen, was ich meine.


4
2018-03-04 20:22



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)  

2
2018-03-04 20:16



Es besteht ein signifikanter Unterschied zwischen der Ausführung der Aktualisierung mit select und dem tatsächlichen Abrufen der Datensätze für den Client, dem Aktualisieren und dem Zurücksetzen der Datensätze:

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

Arbeitet in der Datenbank, keine Daten werden an den Client übertragen.

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

bringt alle Datensätze, die aktualisiert werden sollen, auf den Client, aktualisiert sie und sendet sie dann zurück an die Datenbank, wahrscheinlich mit einem UPDATE pro Datensatz.

Verwenden von UPDATE ist viel, viel schneller als Kriterien zu verwenden (denke tausende Male).


0
2018-03-23 19:57