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.
Vous pouvez jeter un oeil au fichier journal NHibernate et voir quelle déclaration sql est émis . –