c# - left - ¿La API NHibernate Criteria admite proyecciones en propiedades de colección?
nhibernate query (2)
Necesito replicar la siguiente consulta HQL de trabajo usando API de criterios.
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 satisfacen ciertos criterios que pertenecen a padres que satisfacen otro criterio. En mi ejemplo, ambos criterios son igualdades Id simples, pero podrían ser cualquier cosa.
Por algún motivo, la consulta API de criterios equivalentes devuelve una lista con el número correcto de elementos, pero esos elementos 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 no devuelven los mismos resultados?
Aquí está el SQL generado de 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 API de Criteria:
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 padre e hijo es unidireccional. La entidad hija no tiene una propiedad de referencia que apunte a su padre.
¿Alguien puede sugerir una alternativa que me permita evitar esta limitación?
Parece que solo quiere recuperar a los niños, por lo que debe cambiar sus criterios para obtener el tipo de objetos secundarios y luego usar el ID padre como 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();
Considera tener propiedades ''solo consultas'' aquí http://ayende.com/Blog/archive/2009/06/10/nhibernate-ndash-query-only-properties.aspx
Esto le permitiría hacer que el enlace se vea bidireccional para sus consultas.