有没有办法让NHibernate使用Window函数?
具体来说,我希望创建如下的查询:
SELECT
date,
SUM(Price) OVER (ORDER BY date)
FROM purchases
GROUP BY date
我搜索网络,无法找到有关窗口功能和NHibernate的信息
具体来说,我使用了NHibernate的QueryOver接口。
如果不可能,还有哪些其他解决方案可以保持我的代码中的数据库独立性?
答案 0 :(得分:0)
很好的问题,但不幸的是我从未在NHibernate本身看到任何允许它生成这样一个窗口函数的代码。
您唯一的选择是使用命名查询。在您的命名查询中,您可以手动输入SQL或调用存储过程。
您声明要保持解决方案数据库的独立性。我从来没有亲自关心过这样的事情,因为我总是使用SQL Server,但我可以理解你来自哪里。我听说有几个人使用内存中的SQLite解决方案运行集成测试,然后在SQL Server或Oracle上运行他们的实际代码。
在您的方案中,我不相信您的问题中的SQL无论如何都不符合ANSI标准,因此如果您使用命名查询使其与数据库无关,则不得不以不同的方式重写它。
答案 1 :(得分:0)
据我所知,您不能使用QueryOver
API。
我将尽可能保持DB独立性,将窗口查询视为表和组之间的连接。然后编写一个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
答案 2 :(得分:0)
您可以使用视图。这至少可以抽象掉它的一小部分,尽管你实际上是将依赖项迁移到数据库模式。
我最近遇到过这样的问题,我开始意识到我经常尝试以一种不是持久化实体的方式使用NHibernate。如果我是Ayende Rahien,我可能会知道该怎么做,但是因为我不是,所以当我只需要像只读数据统计数据这样的只读聚合结果时,我通常最终会混合使用一些Dapper。