Domanda

ho bisogno di replicare la seguente query HQL di lavoro utilizzando criteri API.

session.CreateQuery(
    "select c " +
    "from Parent p " +
    "inner join p.Children c " +
    "where p.Id = 9 " +
    "and c.Id = 33")
    .SetMaxResults(3)
    .List();

La query seleziona tutti i bambini che soddisfano determinati criteri che appartengono ai genitori che soddisfano un altro criterio. Nel mio esempio sia criterio sono semplici uguaglianze Id ma potrebbe essere qualsiasi cosa.

Per qualche ragione la query API criteri equivalenti restituisce una lista con il giusto numero di elementi, ma tali elementi sono tutti nulli.

session.CreateCriteria(typeof (Parent))
    .Add(Restrictions.Eq("Id", 9))
    .CreateCriteria("Children")
    .Add(Restrictions.Eq("Id", 33))
    .SetProjection(Projections.Property("Children"))
    .SetMaxResults(3)
    .List();

Perché queste due domande non restituiscono gli stessi risultati?

Ecco il codice SQL generato dalla query 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 

E qui è l'SQL dalla query Criteri API:

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 

Si noti che il join tra genitore e figlio è unidirezionale. L'entità bambino non ha una proprietà di riferimento che punta al suo genitore.

Qualcuno può suggerire un'alternativa che mi permettesse di aggirare questa limitazione?

È stato utile?

Soluzione

Cerca in avere 'Query-solo' immobili a qui http://ayende.com/Blog/archive/2009/06/10/nhibernate-ndash-query-only-properties.aspx

Ciò consentirebbe di sfruttare al bidirezionale di collegamento look per le vostre domande.

Altri suggerimenti

Sembra che desideri solo i bambini di nuovo quindi è necessario cambiare i criteri per ottenere il tipo di oggetti figlio quindi utilizzare l'ID genitore come la selezione.

session.CreateCriteria(typeof (Child))
.Add(Restrictions.Eq("Id", 33))
.CreateCriteria("Parent")
.Add(Restrictions.Eq("Id", 9))
.SetProjection(Projections.Property("Children"))
.SetMaxResults(3)
.List();
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top