So verbinden Sie zwei nicht verwandte Entitäten mithilfe von JPA und Hibernate

9

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?

    
juan 06.08.2012, 03:39
quelle

6 Antworten

11

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.

    
dimas 06.08.2012, 07:40
quelle
4

Wie ich in diesen Artikel erklärt habe, gibt es zwei Optionen:

  1. Seit Hibernate 5.1 können Sie Ad-hoc-Joins für nicht verwandte Einheiten.

    %Vor%
  2. 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 .

    
Vlad Mihalcea 07.04.2016 14:33
quelle
3

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.

    
quelle
2

In Hibernate 5.1 ist es möglich, zwei nicht verwandte Entitäten zu verbinden.

ZB:

%Vor%     
rex roy 27.03.2018 06:59
quelle
0

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)

    
Matin Kh 06.08.2012 05:07
quelle
0

Was Sie suchen, ist

  1. HQL
  2. Verknüpfen Sie Felder, die Sie nicht als Beziehungen modelliert haben
  3. Linke Verbindung

(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)

    
Adrian Shum 06.08.2012 04:13
quelle

Tags und Links