2010-09-29 5 views
0

Il semble que lorsque j'utilise la requête NHibernate suivante, je n'obtiens pas d'entité racine lorsque la jointure externe gauche n'a aucun enregistrement.Collection NHibernate Left Left Outer Join Issue d'où

ICriteria critera = session.CreateCriteria(typeof(Entity)); 

criteria.CreateCriteria("SubTable.Property", "Property", NHibernate.SqlCommand.JoinType.LeftOuterJoin); 

criteria.Add(Expression.Not(Expression.Eq("Property", value))); 

SQL que je suis en train de générer est:

SELECT * FROM BaseTable 
LEFT JOIN (
    SELECT * FROM SubTable 
    WHERE Property <> value 
)Sub ON Sub.ForeignKey = BaseTable.PrimaryKey 

Notez que la clause where est à l'intérieur de la jointure gauche de l'instruction Select. De cette façon, s'il n'y a pas de sous-enregistrements de maching, nous obtenons toujours un enregistrement de niveau supérieur. Il semble que NHibernate produise le SQL suivant.

SELECT * FROM BaseTable 
LEFT JOIN (
    SELECT * FROM SubTable 
)Sub ON Sub.ForeignKey = BaseTable.PrimaryKey 
WHERE Sub.Property <> value 

Y a-t-il un moyen de réaliser ce premier morceau de SQL? J'ai déjà essayé:

ICriteria critera = session.CreateCriteria(typeof(Entity)); 

criteria.CreateCriteria("SubTable.Property", "Property", NHibernate.SqlCommand.JoinType.LeftOuterJoin); 

criteria.Add(
    Restrictions.Disjunction() 
     .Add(Expression.IsNull("Property")) 
     .Add(Expression.Not(Expression.Eq("Property", value))); 

Je suis à la recherche d'une solution utilisant l'API Criteria.

+0

Vous pouvez jeter un oeil au fichier journal NHibernate et voir quelle déclaration sql est émis . –

Répondre

0

Essayez this:

var hql = @"select bt 
      from BaseTable bt 
       left join bt.SubTable subt 
        with subt.Property <> :property"; 

Ou peut-être:

var hql = @"select bt 
      from BaseTable bt 
       left join bt.SubTable subt 
        where subt.ForeignKey = bt.PrimaryKey 
         and subt.Property <> :property"; 

Enfin:

var result = session.CreateQuery(hql) 
        .SetParameter("property", "whateverValue") 
        .List<BaseTable>(); 
+0

Vous cherchez à résoudre ce problème avec l'API Criteria de NHibernate. Merci – a432511

0

Je n'utilise NHibernate mais je pense que c'est le SQL vous devez générer:

SELECT * 
FROM BaseTable 
LEFT JOIN SubTable sub 
ON Sub.ForeignKey = BaseTable.PrimaryKey and sub.Property <> value 

Qu'est-ce que vous voulez ISN, t un où clasue mais une condition supplémentaire sur la jointure. J'espère que cela pourra aider.

+0

très vrai ... Je n'ai même pas considéré cela. – a432511

+0

Cela explique pourquoi: http://wiki.lessthandot.com/index.php/WHERE_conditions_on_a_LEFT_JOIN – HLGEM

+0

Je comprends le problème, je suppose que je cherchais comment le résoudre en utilisant l'API NHibernate Criteria. Merci! – a432511