我需要使用条件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
请注意,父级和子级之间的连接是单向的。子实体没有指向其父级的引用属性。
任何人都可以提出一个可以让我解决这个限制的替代方案吗?
答案 0 :(得分:1)
看起来你只想让孩子回来,所以你需要改变你的标准来获得子对象的类型,然后使用父id作为选择。
session.CreateCriteria(typeof (Child))
.Add(Restrictions.Eq("Id", 33))
.CreateCriteria("Parent")
.Add(Restrictions.Eq("Id", 9))
.SetProjection(Projections.Property("Children"))
.SetMaxResults(3)
.List();
答案 1 :(得分:1)
在此处查看“仅限查询”属性http://ayende.com/Blog/archive/2009/06/10/nhibernate-ndash-query-only-properties.aspx
这样您就可以使链接看起来是双向的。