Ich habe eine Anforderung, bei der ich zwei nicht verwandte Objekte mithilfe von Hibernate HQL verknüpfen muss. Hier ist die Beispiel-POJO-Klasse
%Vor%und
%Vor%Nun möchte ich eine Abfrage durchführen wie Wählen Sie * aus Produkt p linken äußeren Join Item i auf p.product_id = i.item_id
Ich möchte ein mehrdimensionales Array als Ausgabe dieser Abfrage, so dass ich separate Exemplare von Produkt und Artikel haben kann, anstatt eines in einem anderen. Gibt es eine Möglichkeit, dies in Hibernate zu tun?
Es ist ungewöhnlich, eine Verknüpfung zwischen Objekten darzustellen, indem die ID des zugehörigen Objekts und nicht das zugehörige Objekt selbst gespeichert wird. Das Speichern des Objekts ist aussagekräftiger und typsicherer und muss keine Auswirkungen auf die Leistung haben, da Hibernate-Funktionen Lazy-Loading-Proxies enthalten.
Aber natürlich können Sie Dinge verbinden, die in der Mapping-Datei nicht als Assoziationen zugeordnet sind. Zitieren des Hibernate-Referenzhandbuchs :
Mehrere Klassen können erscheinen, resultierend in einem kartesischen Produkt oder "Kreuz" beitreten.
%Vor%
Abfragen können mehrere Objekte zurückgeben und / oder Eigenschaften als ein Array des Typs Objekt []:
%Vor%Oder als Liste:
%Vor%Oder - angenommen, dass die Klasse Familie hat einen passenden Konstruktor - als aktuelles typsicheres Java-Objekt:
%Vor%Sie können ausgewählte Aliase zuweisen Ausdrücke verwenden als:
%Vor%Dies ist am nützlichsten, wenn es zusammen verwendet wird mit neuer Karte auswählen:
%Vor%Diese Abfrage gibt eine Map aus Aliasen zurück zu ausgewählten Werten.
Kombiniert man dies mit einer einfachen where-Klausel, erhalten wir:
%Vor%Bearbeiten : Ich habe übersehen, dass Sie eine äußere Verknüpfung möchten. In diesem Fall kenne ich keine andere Möglichkeit, als die Zuordnung zuzuordnen, damit Sie einen normalen Join durchführen können. Beachten Sie, dass dies keine bestimmte Form des Abfrageergebnisses erfordert, d. H. Sie können immer noch Folgendes tun:
%Vor%Es gibt eine Problemumgehung, um über IDs in hql hier beizutreten.
Ich empfehle jedoch, hier eine native SQL-Abfrage zu verwenden.