【问题标题】:NHibernate HQL's Equivalent to T-SQL's TOP KeywordNHibernate HQL 相当于 T-SQL 的 TOP 关键字
【发布时间】:2010-10-07 23:45:37
【问题描述】:

NHibernate HQL 等价于 T-SQL 的 TOP 关键字是什么?

还有什么是非 HQL 的说法,给我一个班级的前 15 个?

【问题讨论】:

    标签: .net nhibernate orm hql


    【解决方案1】:

    从 NHibernate 3.2 开始,您可以在查询末尾在 hql 中使用 SKIP n / TAKE n。在不能使用 SetMaxResults 的子查询中,它可能非常有用。

    例如:

    select l, (select u from User u where u.Location = l order by u.Date asc take 1) 
    from Location l
    

    【讨论】:

      【解决方案2】:

      mookid8000 提供虚假信息。

      没有办法用 HQL 设置 SQL TOP N :(

      它总是将所有表格下载到 .NET 并获得 TOP,这简直是愚蠢的!

      【讨论】:

      • 工作就像宣传的一样。信息不假。
      • 我只是在测试和过滤没有发生在.Net端。
      【解决方案3】:

      为了完整起见,这里是使用 NHibernate 3.0 中引入的 QueryOver API 的方法:

      var top15 = session.QueryOver<SomeEntity>().Take(15).List();
      

      如果您需要定义起始索引,请输入.Skip(someInt),例如用于分页。

      【讨论】:

        【解决方案4】:

        标准 API 方法:

        ICriteria criteria = DaoSession.CreateCriteria(typeof(T));
        criteria.SetFirstResult(StartIndex);
        criteria.SetMaxResults(MaximumObjects);
        return criteria.List<T>();
        

        【讨论】:

        • MaximumObjects 只是一个整数变量,用于告诉 SetMaxResults 返回多少对象。在您的情况下,您可以改为硬编码 15,即 criteria.SetMaxResults(15);
        • 哈哈...也就是说在创建实例后与 CreateQuery() 相同。
        • 您可以流畅地链接所有这些 ICriteria 方法调用,使其更具可读性。
        【解决方案5】:

        在 HQL 中其实很简单:

        var top15 = session.CreateQuery("from SomeEntity")
                        .SetFirstResult(0)
                        .SetMaxResults(15)
                        .List<SomeEntity>();
        

        虽然不知道如何使用标准 API 来做到这一点。

        【讨论】:

        • +1。嗯,这很奇怪。我认为答案将是 HQL“隧道”字符串的一部分。有趣。
        • 这个答案实际上是 HQL 和标准 API 的混合体
        • 是的..它与标准基本相同...只需替换为CreateCriteria&lt;SomeEntity&gt;()
        • 知道如何在选择前 15 名之前对结果进行排序吗?
        • 确定 - session.CreateQuery("from SomeEntity s order by s.SomeProperty").SetFirst(....)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-28
        • 2010-09-21
        • 1970-01-01
        • 1970-01-01
        • 2021-11-29
        相关资源
        最近更新 更多