Ich habe zwei Tabellen - eine mit Adresse und eine mit Fotos. Das einzige gemeinsame Feld zwischen ihnen ist die PersonID. Diese wurden auf zwei POJO-Klassen Adresse und Foto abgebildet. Ich konnte Details in diesen Tabellen abrufen, indem ich Kriterien erstellte und Einschränkungen für die Felder hinzufügte. Wie sollen wir einen Join auf die beiden Tische schreiben? Ist es möglich, das Ergebnis als zwei Objekte zu erhalten - Adresse und Foto.
Ich möchte einen linken Join machen, so dass ich Aufzeichnungen von Personen auch ohne Fotos machen kann. Ich habe gelesen, dass dies nur mit hql möglich ist, aber kann dies auch mit Kriterien gemacht werden?
Sie können problemlos eine HQL-Abfrage schreiben, die das Ergebnis als zwei Objekte zurückgibt, indem Sie Theta-Join verwenden (wie Adrian bemerkte). Hier ist ein Beispiel:
%Vor%Wie Sie sehen können, gibt die Abfrage-Liste der Object [] -Arrays, die jede abgerufene Zeile darstellen. Das erste Element dieses Arrays enthält ein obejct und ein zweites Element - ein anderes.
BEARBEITEN:
Im Falle eines Links Joins müssen Sie eine native SQL-Abfrage (keine HQL-Abfrage) verwenden. Hier erfahren Sie, wie Sie dies tun können:
%Vor%Dies sollte für Ihren Fall funktionieren.
Wie ich in diesen Artikel erklärt habe, gibt es zwei Optionen:
Seit Hibernate 5.1 können Sie Ad-hoc-Joins für nicht verwandte Einheiten.
%Vor%Vor Hibernate 5.1 konnten Sie nur Theta-Joins verwenden. Ein Theta-Stil-Join entspricht jedoch einem Equijoin, daher können Sie nur INNER-Joins und nicht Outer-Joins emulieren.
%Vor%Weitere Informationen finden Sie unter dieser Artikel .
Endlich nach 12 Jahren hat das Hibernate-Team eine solche Funktion implementiert
Von Hibernate-Dokumenten :
Die FROM-Klausel kann auch explizite Beziehungs-Joins mit dem Join-Schlüsselwort enthalten. Diese Joins können entweder innere oder linke äußere Stil-Joins sein.
%Vor% Oder Sie können die Schlüsselwörter WITH
und ON
verwenden. Eine Bemerkung zu diesen
Der wichtige Unterschied ist, dass im generierten SQL die Bedingungen gelten der WITH / ON-Klausel werden Teil der ON-Klausel in der generierten SQL, im Gegensatz zu den anderen Abfragen in diesem Abschnitt, in denen der HQL / JPQL-Bedingungen werden Teil der WHERE-Klausel im generierten SQL.
Beispiel
%Vor%Ich bin gerade dabei, das neue Feature auszuprobieren.
Es ist am besten, eine Klasse zu haben, die die Klassen enthält, an denen Sie teilnehmen möchten, um sie alle zusammen zu haben.
Wenn Sie diese Tabellen jedoch nur für gelegentliche Zwecke verwenden, können Sie Kriterien verwenden und Daten manuell aus jeder Tabelle laden und zusammenstellen. (Und ja, Sie können die Daten dieser Tabellen getrennt haben, wenn für Adresse und Foto zwei separate Klassen und Tabellen vorhanden sind)
Was Sie suchen, ist
(Während der Zeit, als die Frage zum ersten Mal gestellt wurde und diese Antwort gegeben wurde) Hibernate unterstützt Theta Join, mit dem Sie 1 & amp; 2. Für den Theta-Join-Stil steht jedoch nur innerer Join zur Verfügung.
Ich würde dir persönlich empfehlen, die richtigen Beziehungen zu modellieren, also brauchst du nur 1 & amp; 3, die in HQL gut unterstützt wird.
(Eine andere Antwort enthielt ein Update für die neue Hibernate-Funktion, die eine solche Funktion bietet, auf die Sie sich einfach beziehen können)