Hibernate-Kriterienabfrage mit Unterabfrage, die zwei Spalten verbindet

8

Ich habe eine Tabelle, "Quote", im Hibernate gemappt, die einen zusammengesetzten Schlüssel aus einer Integer-ID und einem Datum sowie mehrere zusätzliche Spalten enthält. Ich möchte eine Kriterienabfrage schreiben, die DetachedCriteria verwendet, um die Zeile für jede ID mit dem größten Datum abzurufen.

In SQL könnte ich eine Abfrage wie

schreiben %Vor%

Im Hibernate kann ich eine DetachedCriteria für die Unterabfrage "group by" erstellen (Quote ist die Klasse, die die Tabelle abbildet) und "Qid" ist eine zusammengesetzte ID-Klasse für den Schlüssel, mit den Eigenschaften id und date, Zugriff über eine "qid" -Eigenschaft der Quote-Klasse):

%Vor%

Ich bin mir jedoch nicht sicher, wie ich dies in einer Kriterienabfrage verwenden soll, die dem äußeren Teil der obigen Tabelle entspricht. Ich suche etwas nach dem Motto

%Vor%

Wo die beiden obigen Property.forName die äußere Tabelle mit den entsprechenden Spalten der Unterabfrage verbinden. Wenn der innere Join nur einen Wert liefert, würde ich dem DetachedCriteria einfach eine einzelne Projektion geben und den DetachedCriteria gerade in Property.forName (...). Eq (..) übergeben. Ich bin mir nicht sicher, wie man die DetachedCriteria mit zwei Werten (id und maxdate) in der Projektion verwendet.

    
cha 01.10.2013, 19:28
quelle

2 Antworten

10

Hatte genau das gleiche Problem und konnte keine exakte Lösung für eine mehrspaltige Unterabfrage finden. Was ich getan habe, war die Abfrage neu schreiben, so dass es nur die Subselect auf einer Spalte übereinstimmen muss. Also statt

%Vor%

Versuchen Sie

%Vor%

Der Hauptunterschied besteht darin, dass die MAX-Bedingung des JOIN-Kriteriums jetzt alle innerhalb des inneren SELECT liegt.

Die Kriterien / abgelöste Kriterien für dieses sieht wie folgt aus:

%Vor%

Das erzeugte SQL sieht folgendermaßen aus:

%Vor%

Sie werden bemerken, dass es im SQL keine Gruppierung nach gibt, weil sie nicht benötigt wird. Ich würde erwarten, dass einer da ist, wenn es im Subselect mehr als eine Matchbedingung gibt.

Wie auch immer, hoffe es hilft. Das ist das letzte, was ich vor Weihnachten machen werde!

    
Mark O'Driscoll 20.12.2013 15:45
quelle
3

Ich habe einen ähnlichen Anwendungsfall. Ich bin mir ziemlich sicher, dass dies nicht mit Criteria möglich ist. Hibernate unterstützt keine Joins in der from-Klausel: Ссылка (zum Zeitpunkt des Schreibens noch geöffnet).

>

Die Antwort auf Weihnachten 2013 ist ziemlich gut, aber unglücklicherweise ist diese korrelierte Unterabfrage in meinem Anwendungsfall wirklich schlecht:

  • mit MySQL
  • Es kann Tausende von Daten für jede ID geben

Aber dieses ist in Ordnung (für MySQL 5.6.25 sowieso):

%Vor%

Ich kam hierher, um nach einer Antwort auf

zu suchen %Vor%

Aber es scheint, als ob keine solche Magie existiert. Ich musste aufgeben und hql verwenden, was wahrscheinlich am besten ist, da laut der Hibernate 4.2-Dokumentation die API für das Hibernate-Kriterium ohnehin veraltet ist: Ссылка

    
Don Willis 02.02.2016 09:18
quelle