休眠和窗口函数
Posted
技术标签:
【中文标题】休眠和窗口函数【英文标题】:nhibernate and window functions 【发布时间】:2013-03-28 21:51:45 【问题描述】:有什么方法可以让 NHibernate 使用 Window 函数?
具体来说,我希望创建如下查询:
SELECT
date,
SUM(Price) OVER (ORDER BY date)
FROM purchases
GROUP BY date
我在网上搜索过,但找不到任何关于窗口函数和 NHibernate 的信息
具体来说,我正在使用 NHibernate 的 QueryOver 接口。
如果不可能,还有哪些其他解决方案可以在我的代码中保持数据库独立性?
【问题讨论】:
不应该是 SUM(Price) OVER (PARTITION BY date) 吗? 对于 SQL Server 是,但对于 Postgres 不是。 谢谢,你应该把这个添加到你的问题/标签中 问题是关于数据库独立性,这就是为什么没有提到我正在使用的数据库。 【参考方案1】:好问题,但不幸的是,我从未在 NHibernate 本身中看到任何允许它生成这样一个窗口函数的代码。
您唯一的选择是使用命名查询。在您的命名查询中,您可以手动输入 SQL 或调用存储过程。
您表示您希望使您的解决方案数据库保持独立。我个人从来没有关心过像我一直使用 SQL Server 那样做的事情,但我能理解你来自哪里。我听说有几个人使用内存中的 SQLite 解决方案运行他们的集成测试,然后在 SQL Server 或 Oracle 上运行他们的实际代码。
在您的场景中,我不相信您问题中的 SQL 无论如何都符合 ANSI,因此如果您使用命名查询使其独立于数据库,那么不幸的是您必须以不同的方式重新编写它。
【讨论】:
【参考方案2】:据我所知,QueryOver
API 无法做到这一点。
为了尽可能保持数据库独立性,我将把窗口化查询视为您的表和按查询分组之间的连接。然后编写一个 QueryOver 来引导这个连接。
考虑到您的查询,它会导致:(尽管该示例似乎并未真正表明需要窗口查询)
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
【讨论】:
感谢您的评论,但是,您也不能加入 QueryOver 中的子查询。【参考方案3】:您可能会为此使用视图。尽管您实际上是在将依赖关系迁移到数据库模式,但至少可以抽象出一点。
我最近也遇到了这类问题,我开始意识到我经常尝试以一种与持久实体无关的方式使用 NHibernate。如果我是 Ayende Rahien,我可能会知道该怎么做,但由于我不是,所以当我只需要诸如数据统计信息之类的只读聚合结果之类的东西时,我通常最终会混入一点 Dapper。
【讨论】:
以上是关于休眠和窗口函数的主要内容,如果未能解决你的问题,请参考以下文章