2009-11-25 30 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查詢。同樣,如果你正在做一些高度動態的事情,這種方法可能不起作用,但它是解決問題的方法。