Est-ce que NHibernate critères projections de support de l'API sur les propriétés de collecte?

StackOverflow https://stackoverflow.com/questions/856761

  •  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?

Était-ce utile?

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();
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top