2 Stimmen

Hibernate HQL : where clause with list

Ich bin ein wenig verwirrt von Hibernate. Mein Problem ist folgendes:

Ich habe ein Objekt in einer Tabelle in meiner Datenbank, und dieses Objekt ist mit verschiedenen Kommentaren verbunden (die in einer anderen Tabelle gespeichert sind)

In HQL möchte ich diese Objekte in meiner Tabelle auswählen, aber nur wenn der letzte Kommentar, der mit dem Objekt verknüpft ist, einen bestimmten Status hat (der letzte Kommentar ist derjenige mit der höchsten ID). Ein Kommentar ist immer nur mit einem Objekt verbunden.

Dieser Befehl funktioniert einwandfrei:

    select distinct myObject from org.MyClass myInstance
    join myObject.comments comment
    where comment.status in (:theListOfStatusThatIWant)

Aber dieser Befehl tut nicht das, was ich möchte...

Ich habe folgendes versucht:

     select distinct myObject from org.MyClass myInstance
     join myObject.comments comment
     where comment.status in (:theListOfStatusThatIWant)
     order by comment.id desc

Aber ohne Erfolg... (der Befehl funktioniert, macht aber nicht, was ich möchte)

Kann mir jemand helfen?

3voto

axtavt Punkte 233070

Sie müssen den Umstand ausdrücken, dass Sie den letzten Kommentar möchten, so ähnlich wie hier:

select distinct myObject from org.MyClass myInstance
join myObject.comments comment
where comment.status in (:theListOfStatusThatIWant)
und comment.id = 
    (select max(c1.id) from Comment c1 where c1 member of myObject.comments)

0voto

Greg Punkte 116

Ein erster Gedanke zu Ihrer Abfrage besteht darin, das umzukehren, was Sie abfragen. In Pseudo-HQL:

select c.objectYouReallyWant from Comment c where c.status = ? order by c.id desc

Sie können dann maxResults festlegen (abhängig von der Datenbank, glaube ich), um nur eine einzelne Zeile zurückzubekommen. Leider liefert dies nur den letzten Kommentar mit dem richtigen Status zurück. Wenn Sie den letzten Kommentar erhalten möchten, unabhängig vom Status, müssen Sie die Statusbeschränkung fallen lassen.

Ein Limit (auch maximal Ergebnisse genannt) sollte bei der Ausführung billiger sein als ein Subselect, um das Maximum einer bestimmten Zeile zu finden), aber natürlich müssten Sie es testen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X