2010-06-16 6 views
6

Wie kann ich NHibernate zwingen, eine RECHTE äußere Verknüpfung oder eine INNER-Verknüpfung anstelle einer LINKEN äußeren Verknüpfung in einer Viele-zu-viele-Auflistung vorzunehmen?Inneres oder rechtes äußeres Beitreten in Nhibernate und fließendes Nhibernate auf viele zu vielen Auflistung

Der Grund, warum ich dies tun möchte, ist aufgrund der Filterung auf die Sammlungselemente angewendet. Bei einer linken Verknüpfung erhalten Sie die gleiche Anzahl an Zeilen wie bei einer ungefilterten Abfrage, aber die herausgefilterten Elemente zeigen nur NULL für alle Felder an. Bei einem rechten Join wird jedoch die korrekte Anzahl von Zeilen und Elementen von der Abfrage zurückgegeben.

Ich würde erwarten, dass man die Verbindung irgendwo in der Abbildung der Sammlung angeben könnte ..

+0

macht das überhaupt Sinn? Sie möchten eine Sammlung von Entitäten abrufen, die wirklich keine Verbindung zur Stammentität haben. – Jaguar

+0

@Jaguar: Ja, weil ich einen Fall habe, bei dem Filter auf die verbundenen Elemente angewendet werden. Da die Join-Tabelle die primäre Tabelle in der Abfrage ist, erhalte ich bei der LINKEN Verknüpfung jedoch mehr Zeilen als die tatsächlichen gefilterten Entitäten, die ich haben möchte. Die herausgefilterten Entitäten haben in allen Spalten nur NULL. – snicker

Antwort

5

Ich glaube nicht, dass es möglich ist, ein Recht zu spezifizieren oder innere Verknüpfung in der Sammlung Mapping. Die einzigen Optionen mit der fetch-Klausel sind die standardmäßige linke äußere Verknüpfung und die sequenzielle Auswahl.

Das Problem besteht darin, dass NHibernate beim Erstellen eines Mappings wissen muss, wie die Auflistungselemente für ein beliebiges Root-Element von der linken Seite des Joins abgerufen werden. Bei einem Rechts- oder Innenjoin ist das Stammobjekt in der zurückgegebenen Sammlung möglicherweise nicht vorhanden, sodass Sie an diesem Punkt feststecken.

Wenn die Filterkriterien statisch sind, können Sie im Mapping eine where-Klausel angeben. Ich denke, das wäre die empfohlene Lösung für Ihre Situation. Eine Problemumgehung wäre, die Sammlung in Ihrem Objekt privat zu machen und dann eine andere Eigenschaft zu erstellen, die eine HQL-Abfrage aufruft, um den inneren Join zu implementieren und diese Sammlung zurückzugeben. Diese zurückgegebene Auflistung hätte die von Ihnen gewünschte Semantik, Sie benötigen jedoch separate Methoden zum Hinzufügen oder Entfernen von Elementen aus der Sammlung.

+0

Dies ist im Grunde die Lösung, die ich implementiert habe. Ich ließ zu, dass die Abfragen die gesamte Sammlung ungefiltert zurückgaben und die Filterung auf der Anwendungsseite der Dinge manuell durchgeführt wurde. Nicht sehr elegant wegen der Menge an zusätzlichen Daten, die in einigen Fällen über den Draht kommen, aber definitiv die einfachste Lösung, ohne die NH-Quelle aufzubrechen und sie in das zu verwandeln, was ich will. – snicker

+0

Das ist der Grund, warum ich vorgeschlagen habe, HQL von einer Eigenschaft aufzurufen. Die Filterung würde in der DB erfolgen. Sie müssten mit NH nichts Besonderes machen, führen Sie einfach eine Abfrage aus einer nicht zugeordneten Eigenschaft aus. Abhängig von Ihrem Datensatz kann die reduzierte Datenübertragung erheblich sein. –

1

Sie können NHibernate HQL-Syntax verwenden, um eine Abfrage zu generieren, die von SQL erinnernd ist, nutzt aber NHibernate Mapping Fähigkeiten. HQL unterstützt right outer join (oder kurz right join). Auf den folgenden Seiten sind gute Referenzen für NHibernate HQL-Abfragesprache:

+0

Ich brauche das bei jedem Abruf aus der Datenbank. Nicht nur spezifische Anfragen. – snicker

Verwandte Themen