Hace proyecciones de apoyo Criterios de NHibernate API de propiedades de la colección?

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

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

¿Fue útil?

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();
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top