Fa sporgenze di sostegno Criteri NHibernate API sulle proprietà di raccolta?
-
21-08-2019 - |
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?
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();