2009-11-25 52 views
2

在问这个问题之前,我搜索了一段时间,但没有找到任何有关此主题的信息。NHibernate调用PostgresSQL的SELECT DISTINCT ON()

我的问题很简单:

我有NHibernate的标准和投影,我想设置DISTINCT ON(列)

我对投影代码如下:

 criteria.SetProjection(
      Projections.ProjectionList() 
      .Add(Projections.Distinct(Projections.Property("ID"))) 
      .Add(Projections.Property("A")) 
      .Add(Projections.Property("B")) 
     ); 

这生成以下SQL(位简化):

SELECT DISTINCT ID, A, B FROM ABC ORDER BY A 

但不幸的是pe如果这个查询非常差,那么这个性能会很高。

我已经优化我的SQL运行得更快,看起来像这样:

SELECT DISTINCT ON (A) ID, A, B FROM ABC ORDER BY A 

反正我有可以让NHibernate的生成SQL,我已经展示? NHibernate的方言可以解决这个问题吗?

期待您的反馈! 非常感谢!

回答

0

这不是最优雅的解决方案,但我想知道您是否可以通过使用“SQLProjection”来完成您所需的任务?我是一个Java的家伙,所以代码可能不完全在这里,但下面的方法看起来像它的工作原理我使用的是Postgres为:

criteria.SetProjection(
    Projections.ProjectionList() 
    .Add(Projections.SqlProjection("DISTINCT ON(A) ID")) 
    .Add(Projections.Property("A")) 
    .Add(Projections.Property("B")) 
); 

产生你在你的问题给出了优化的SQL查询。同样,如果你正在做一些高度动态的事情,这种方法可能不起作用,但它是解决问题的方法。