2010-02-05 11 views
8

Je fais une jointure gauche, mais je ne peux appliquer des restrictions sur la première table. Existe-t-il un moyen de l'appliquer sur la deuxième table?Hibernate Critères: Left Outer Join avec des restrictions sur les deux tables

Voici mon code:

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

Cela fonctionne (le demandeur possède une propriété applicantName):

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

Aucune de ces œuvres (produit possède une propriété productName)

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

criteria.add (Restrictions.eq ("products.productName", "product1") // products: le nom de la propriété criteria.add (Restrictions.eq ("Product.productName", "product1") // Produit: le nom de la table DB

Et c'est l'exception que je reçois en disant (si je comprends bien) que le la propriété productName n'existe pas demandeur:

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 

J'ai essayé d'utiliser un alias, mais ce changement a INNER JOIN, au lieu de la gauche OUTER JOIN je veux.

Comment puis-je appliquer des restrictions sur les deux tables?

MISE À JOUR:

problème est probablement la même que celle-ci: https://forum.hibernate.org/viewtopic.php?p=2393694

Répondre

12

Vous pouvez spécifier la gauche jointure externe dans les createAlias ​​...

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

Soyez conscient que vous êtes faire une jointure externe gauche avec une restriction sur cette colonne ... ce qui en fait essentiellement une jointure interne. Si vous voulez également des candidats sans produits, vous devrez également vérifier le produit nul.

0

Mise à jour:

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

J'ai résolu ce mon problème créer un nouveau critère et je pourrais utiliser LEFT_OUTER_JOIN dans les deux cas.