NHibernate Criteria API是否支持对集合属性的预测?

我需要使用条件API复制以下工作HQL查询。

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

查询选择满足属于满足其他条件的父项的特定条件的所有子项。 在我的例子中,两个标准都是简单的Id等式,但它们可以是任何东西。

由于某种原因,等效标准API查询返回具有正确数量的项目的列表,但这些项目都为空。

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

为什么这两个查询不会返回相同的结果?

以下是HQL查询生成的SQL:

 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 

以下是Criteria API查询中的SQL:

 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 

请注意,父级和子级之间的连接是单向的。 子实体没有指向其父级的引用属性。

任何人都可以提出一个可以让我解决这个限制的替代方案吗?

在这里查看“仅查询”属性http://ayende.com/Blog/archive/2009/06/10/nhibernate-ndash-query-only-properties.aspx

这将允许您使查询的链接看起来是双向的。

看起来您只想让孩子回来,所以您需要更改标准以获取子对象的类型,然后使用父ID作为选择。

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