Hace proyecciones de apoyo Criterios de NHibernate API de propiedades de la colección?
-
21-08-2019 - |
Pregunta
necesito para replicar la siguiente consulta HQL de trabajo utilizando los criterios del 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 consulta selecciona todos los niños que cumplen con ciertos criterios que pertenecen a los padres que cumplen otro criterio. En mi ejemplo, tanto el criterio son simples igualdades Id pero podría ser cualquier cosa.
Por alguna razón la consulta de la API criterios equivalentes devuelve una lista con el número correcto de artículos, pero esos artículos son todos nulos.
session.CreateCriteria(typeof (Parent))
.Add(Restrictions.Eq("Id", 9))
.CreateCriteria("Children")
.Add(Restrictions.Eq("Id", 33))
.SetProjection(Projections.Property("Children"))
.SetMaxResults(3)
.List();
¿Por qué estas dos consultas devuelven los mismos resultados?
Aquí está el SQL generado por la consulta 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
Y aquí está el SQL de la consulta de la API Criterios:
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
Tenga en cuenta que la unión entre padres e hijos es unidireccional. La entidad niño no tiene una propiedad de referencia que apunta a su matriz.
¿Puede alguien sugerir una alternativa que me permita evitar esta limitación?
Solución
Mira en tener 'sólo de consulta' en propiedades aquí http://ayende.com/Blog/archive/2009/06/10/nhibernate-ndash-query-only-properties.aspx
Esto permitirá realizar el enlace bidireccional mirada para sus consultas.
Otros consejos
Parece que sólo quiere que los hijos de vuelta por lo que necesita para cambiar los criterios para obtener el tipo de los objetos secundarios a continuación, utilizar el ID de padre como la selección.
session.CreateCriteria(typeof (Child))
.Add(Restrictions.Eq("Id", 33))
.CreateCriteria("Parent")
.Add(Restrictions.Eq("Id", 9))
.SetProjection(Projections.Property("Children"))
.SetMaxResults(3)
.List();