Hibernate Kriterien: Left Outer Join mit Einschränkungen auf beiden Tabellen
-
18-09-2019 - |
Frage
Ich mache eine LEFT OUTER JOIN, aber ich bin nur in der Lage Beschränkungen der ersten Tabelle anzuwenden. Gibt es eine Möglichkeit ti auf der zweiten Tabelle gelten auch?
Hier ist mein Code:
Criteria criteria = this.crudService
.initializeCriteria(Applicant.class).setFetchMode("products",
FetchMode.JOIN);.
Das funktioniert (Antragsteller hat eine applicantName Eigenschaft):
criteria.add(Restrictions.eq("applicantName", "Markos")
Keines dieser Werke (Produkt hat eine Eigenschaft Product)
criteria.add(Restrictions.eq("productName", "product1")
criteria.add (Restrictions.eq ( "Products.ProductName", "product1") // Produkte: der Name der Eigenschaft criteria.add (Restrictions.eq ( "wizard.productName", "product1") // Produkt: der Name der DB-Tabelle
Und das ist die Ausnahme Ich erhalte sagen (wenn ich das richtig verstehe), dass die Eigenschaft nicht in Product Anmelderin existiert:
EJB Exception: ; nested exception is: org.hibernate.QueryException: could not resolve property: products.inventedName of: org.myCompany.applicant.entity.Applicant; nested exception is: org.hibernate.QueryException: could not resolve property: products.inventedName of: org.myCompany.applicant.entity.Applicant
Ich habe versucht, einen Aliasnamen zu verwenden, aber dies erzeugt ein INNER JOIN anstelle der LEFT OUTER JOIN ich will.
Wie kann ich gelten Einschränkungen auf beiden Tabellen?
UPDATE:
Ausgabe ist wahrscheinlich das gleiche wie folgt aus: https://forum.hibernate.org/viewtopic.php?p=2393694
Lösung
Sie können die äußere Verknüpfung angeben links in den Create ...
.CreateAlias("products", "p", NHibernate.SqlCommand.JoinType.LeftOuterJoin)
.Add(Restrictions.Eq("p.inventedName", inventedName));
Beachten Sie, dass Sie mit einer Beschränkung dieser Spalte eine linke äußere Verknüpfung tun ... im Wesentlichen so dass es eine innere Verknüpfung. Wenn Sie auch Bewerber wollen, ohne Produkte dann werden Sie haben auch für null Produkt zu überprüfen.
Andere Tipps
Update:
.CreateAlias("products", "p", JoinType.LEFT_OUTER_JOIN)
.Add(Restrictions.Eq("p.inventedName", inventedName));
Ich löste dieses mein Problem ein neue Kriterien zu schaffen, und ich LEFT_OUTER_JOIN in beiden Fällen nutzen könnte.