Est-ce que NHibernate critères projections de support de l'API sur les propriétés de collecte?
-
21-08-2019 - |
Question
Je dois répliquer la requête HQL suivante en utilisant l'API de travail de critères.
session.CreateQuery(
"select c " +
"from Parent p " +
"inner join p.Children c " +
"where p.Id = 9 " +
"and c.Id = 33")
.SetMaxResults(3)
.List();
La requête sélectionne tous les enfants qui satisfont à certains critères qui appartiennent aux parents qui satisfont un autre critère. Dans mon exemple, les deux critères sont simples égalités Id, mais ils pourraient être quelque chose.
Pour une raison quelconque la requête API critères équivalents renvoie une liste avec le bon nombre d'articles, mais ces articles sont tous nuls.
session.CreateCriteria(typeof (Parent))
.Add(Restrictions.Eq("Id", 9))
.CreateCriteria("Children")
.Add(Restrictions.Eq("Id", 33))
.SetProjection(Projections.Property("Children"))
.SetMaxResults(3)
.List();
Pourquoi ne pas ces deux requêtes renvoient les mêmes résultats?
Voici le SQL généré à partir de la requête HQL:
SELECT TOP 3 childid7_,
name7_
FROM (SELECT children1_.childid AS childid7_,
children1_.name AS name7_,
Row_number()
OVER(ORDER BY current_timestamp) AS __hibernate_sort_row
FROM dbo.parent parent0_
LEFT OUTER JOIN dbo.child children1_
ON parent0_.parentid = children1_.parentid
WHERE (parent0_.parentid = 9)
AND (children1_.childid = 33)) AS QUERY
WHERE QUERY.__hibernate_sort_row > 0
ORDER BY QUERY.__hibernate_sort_row
Et voici le SQL à partir de l'API Critères requête:
SELECT TOP 3 y0_
FROM (SELECT this_.parentid AS y0_,
Row_number()
OVER(ORDER BY current_timestamp) AS __hibernate_sort_row
FROM dbo.parent this_
INNER JOIN dbo.child child1_
ON this_.parentid = child1_.parentid
WHERE this_.parentid = @p0
AND child1_.childid = @p1) AS QUERY
WHERE QUERY.__hibernate_sort_row > 0
ORDER BY QUERY.__hibernate_sort_row
Notez que la jonction entre le parent et l'enfant est à sens unique. L'entité enfant ne dispose pas d'une propriété de référence pointant vers son parent.
Quelqu'un peut-il proposer une alternative qui me permettrait de contourner cette limitation?
La solution
Rechercher dans ayant des propriétés 'Query-uniquement' dans ici http://ayende.com/Blog/archive/2009/06/10/nhibernate-ndash-query-only-properties.aspx
Cela vous permettra de faire le look de liaison bidirectionnelle pour vos requêtes.
Autres conseils
On dirait que vous voulez que les enfants de retour de sorte que vous devez changer vos critères pour obtenir le type de l'enfant des objets puis utilisez l'ID parent comme la sélection.
session.CreateCriteria(typeof (Child))
.Add(Restrictions.Eq("Id", 33))
.CreateCriteria("Parent")
.Add(Restrictions.Eq("Id", 9))
.SetProjection(Projections.Property("Children"))
.SetMaxResults(3)
.List();