Ich habe ein Problem damit, dass Hibernate ungültiges SQL generiert. Insbesondere das Mischen und Anpassen von impliziten und expliziten Joins. Dies scheint ein offener Fehler zu sein.
Ich bin mir jedoch nicht sicher warum das ist ungültige SQL. Ich habe ein kleines Spielzeugbeispiel gefunden, das dieselbe Syntaxausnahme erzeugt.
Diese beiden Abfragen funktionieren. Ich weiß, dass es ein kartesisches Produkt gibt; das ist beabsichtigt.
Explizite Verbindung:
%Vor%Implizite JOIN:
%Vor%Diese Abfrage funktioniert NICHT bei MSSQL 2000/2008 oder MySQL:
%Vor%In MS2000 bekomme ich den Fehler:
Das Spaltenpräfix 'e1' stimmt nicht überein mit einem Tabellennamen oder Aliasnamen verwendet in der Abfrage.
In MySQL lautet der Fehler:
Unbekannte Spalte 'e1.managerEmployeeID' in 'on-Klausel'.
Dies führt zu einem Fehler, da gemäß dem SQL-Standard das Schlüsselwort JOIN
einen höheren Vorrang hat als das Komma. Der kritische Punkt ist, dass Tabellenaliase nicht verwendbar sind, bis nachdem die entsprechende Tabelle in der FROM
-Klausel ausgewertet wurde.
Wenn Sie also e1
in Ihrem JOIN...ON
-Ausdruck referenzieren, ist e1
noch nicht vorhanden.
Bitte halte dich bereit, während ich Hibernate recherchiere und finde heraus, ob du es überreden kannst, in allen Fällen JOIN
zu verwenden.
Hmm. Alles auf Hibernate.org scheint auf jboss.org umgeleitet zu werden. Also keine Möglichkeit, die HQL-Dokumentation online zu lesen. Ich bin mir sicher, dass sie herausfinden werden, wie ihr Name schließlich dient.
PostgreSQL gibt auch einen Fehler:
%Vor%Ich denke, das Problem ist, dass wenn Sie zwei Tabellen a und b (e2 und e1Manager in diesem Fall) verbinden, können Sie nur diese beiden Tabellen in der "ON" -Klausel verweisen. Sie können also in dieser ON-Klausel auf e2 und e1Manager verweisen, aber nicht auf e1.
Ich denke, das geht so weit, dass Sie, wenn Sie eine Kette von "JOIN" -Anweisungen haben, in "ON" -Klauseln auf andere Tabellen in derselben Kette verweisen können, aber kein ",". So etwas wie 'ein JOIN b ON a.a_id = b.a_id JOIN c ON c.b_id = b.b_id UND c.a_id = a.a_id "ist erlaubt.
Was ist der HQL, den Sie verwenden, um dieses SQL zu erstellen? Etwas wie "wähle e1.name, e2.name, e1.manager.name von Employee e1, Employee e2"?
Dies könnte ein bisschen vom Thema abweichen, da es sich nicht um den Winterschlaf handelt, sondern um den Kommentar von Bill Karwin < Ich öffnete wirklich meine Augen. Anstatt zuerst den impliziten Join zu schreiben, müssen Sie zuerst den expliziten Join durchführen. Diese Syntax ist besonders interessant, wenn Sie mehrere implizite Joins haben.
Überprüfen Sie das folgende Beispiel in MS SQL. Nicht alle Kontakte haben einen Ländercode definiert, aber alle Kontakte haben ein Attribut val, das in der Tabelle Tbl nachgeschlagen wird. Also die intuitive Lösung wird nicht funktionieren:
%Vor%Stattdessen möchten Sie vielleicht lieber die folgende Syntax verwenden:
%Vor%Tags und Links sql hibernate join cartesian-product cross-join