2010-02-05 6 views
8

Ich mache eine LINKE OUTER JOIN, aber ich kann nur Einschränkungen für die erste Tabelle anwenden. Gibt es eine Möglichkeit, auch auf der zweiten Tabelle zu gelten?Hibernate Kriterien: Left Outer Join mit Einschränkungen für beide Tabellen

Hier ist mein Code:

Criteria criteria = this.crudService 
     .initializeCriteria(Applicant.class).setFetchMode("products", 
       FetchMode.JOIN);. 

Dies funktioniert (Antragsteller hat eine applicantName Eigenschaft):

criteria.add(Restrictions.eq("applicantName", "Markos") 

Keines dieser Werke (Produkt eine product Eigenschaft hat)

criteria.add(Restrictions.eq("productName", "product1") 

criteria.add (Einschränkungen.eq ("products.productName", "product1") // Produkte: der Name der Eigenschaft criteria.add (Einschränkungen.eq ("Product.productName", "product1") // Produkt: der Name der DB-Tabelle

Und dies ist die Ausnahme, die ich (wenn ich richtig verstehe) sage, dass die product Objekt besteht nicht in Anmelder:

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 Einschränkungen für beide Tabellen anwenden?

UPDATE:

Ausgabe ist wahrscheinlich das gleiche wie folgt aus: https://forum.hibernate.org/viewtopic.php?p=2393694

Antwort

12

Sie äußere linke angeben können in den Create beitreten ...

.CreateAlias("products", "p", NHibernate.SqlCommand.JoinType.LeftOuterJoin) 
.Add(Restrictions.Eq("p.inventedName", inventedName)); 

Beachten Sie, dass Sie macht einen linken Outer-Join mit einer Beschränkung auf diese Spalte ... im Wesentlichen macht es einen inneren Join. Wenn Sie auch Bewerber ohne Produkte möchten, müssen Sie auch nach einem Nullprodukt suchen.

0

Update:

.CreateAlias("products", "p", JoinType.LEFT_OUTER_JOIN) 
.Add(Restrictions.Eq("p.inventedName", inventedName)); 
0

Ich löste dieses mein Problem eine neue Kriterien zu schaffen, und ich konnte LEFT_OUTER_JOIN in beiden Fällen verwenden.