0

有什么方法可以让 NHibernate 使用 Window 函数?

具体来说,我希望创建如下查询:

SELECT
  date,
  SUM(Price) OVER (ORDER BY date)
FROM purchases
GROUP BY date

我在网上搜索并找不到任何关于窗口函数和 NHibernate 的信息

具体来说,我使用 NHibernate 的 QueryOver 接口。

如果不可能,还有哪些其他解决方案可以在我的代码中保持数据库独立性?

4

3 回答 3

0

As far as I know, you can't do that with the QueryOver API.

What I would do to keep as DB independant as possible would be to consider the windowed query as a join between your table and a group by query. Then to write a QueryOver which would lead this join.

Considering you query it would lead to this : (though the example does not seem to really show the need for a windowed query)

SELECT
  purchases.date,
  purchasesGroup.priceSum
FROM 
     purchases
INNER JOIN 
     (SELECT date, SUM(Price) as priceSum  FROM purchases GROUP BY date) 
       AS purchasesGroup
on purchases.date = purchasesGroup.date
于 2013-03-29T13:06:41.850 回答
0

您可能会为此使用视图。尽管您实际上是在将依赖项迁移到数据库模式,但这至少可以抽象出一点。

我最近也遇到了这种问题,我开始意识到我经常尝试以一种与持久实体无关的方式使用 NHibernate。如果我是 Ayende Rahien,我可能会知道该怎么做,但因为我不是,所以当我只需要只读聚合结果(例如数据统计信息)时,我通常会混入一点 Dapper。

于 2013-04-02T12:37:07.647 回答
0

好问题,但不幸的是,我从未在 NHibernate 本身中看到任何允许它生成这样一个窗口函数的代码。

您唯一的选择是使用命名查询。在您的命名查询中,您可以手动输入 SQL 或调用存储过程。

您说您希望保持您的解决方案数据库独立。我个人从来没有关心过像我一直使用 SQL Server 那样做的事情,但我能理解你来自哪里。我听说有几个人使用内存中的 SQLite 解决方案运行他们的集成测试,然后在 SQL Server 或 Oracle 上运行他们的实际代码。

在您的情况下,我不相信您问题中的 SQL 无论如何都符合 ANSI,因此如果您使用命名查询使其独立于数据库,那么不幸的是,您必须以不同的方式重新编写它。

于 2013-03-29T01:02:43.350 回答