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

标签 c# nhibernate criteria

我需要使用条件 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();

查询选择所有满足特定条件的 child ,这些 child 属于满足另一个条件的 parent 。 在我的示例中,两个标准都是简单的 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

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

关于c# - NHibernate Criteria API 是否支持对集合属性的预测?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/856761/

相关文章:

nHibernate 不检索手动更改的数据

symfony - 如何在 Controller 中向 Shopware 6 产品添加新的交叉销售?

Hibernate Criteria 查询 - 类转换异常

c# - 我怎样才能从我的条形码阅读器读取条形码

c# - 如何命名 c# 类字段以便能够反序列化具有无效字符的 json 字段名称

nhibernate - 使用 NHibernate QueryOver,如何在日期之间添加类型安全限制

Java Hibernate暂时忽略带有条件的@ManyToOne注释

c# - 如何捕获整个查询字符串?

c# - 如何从 C# 中的 HTTP Post 访问 header 信息?

NHibernate 多线程问题