2013-03-28 114 views
0

有什么办法让NHibernate使用Window函数吗?nhibernate和窗口函数

具体来说,我希望建立类似下面的查询:

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

我已经搜索网络并不能找到有关窗函数和NHibernate什么

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

如果这是不可能的,还有什么其他解决方案来保持我的代码中的数据库独立性?

+0

不应该是SUM(Price)OVER(PARTITION BY date)? – jbl

+0

对于SQL Server是的,但不适用于Postgres。 – Martin

+0

thx,你应该添加到你的问题/标签 – jbl

回答

0

很好的问题,但不幸的是,我从来没有看到任何代码在NHibernate本身,将允许它产生这样的窗口功能。

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

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

在你的场景中,我不认为你的问题中的SQL无论如何都是ANSI兼容的,所以如果你使用命名查询使它与数据库无关,那么你不得不以不同的方式重写它。

0

据我所知,你不能这样做与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 
+0

但是,感谢您的评论,您无法加入QueryOver中的子查询。 – Martin

0

你可能会使用这样的观点。这至少可以抽象出一点,尽管你确实将依赖关系迁移到数据库模式。

我最近遇到了这类问题,并且我开始意识到我经常试图以一种并非真正持久实体的方式来使用NHibernate。如果我是Ayende Rahien,我可能会知道该怎么做,但由于我不是,通常最终会混入一个小巧的Dapper,因为我只需要诸如统计关于数据的只读聚合结果。