【问题标题】:NHibernate calling PostgresSQL's SELECT DISTINCT ON ()NHibernate 调用 PostgresSQL 的 SELECT DISTINCT ON ()
【发布时间】:2009-11-25 19:20:56
【问题描述】:

在问这个问题之前,我已经用谷歌搜索了一段时间,但找不到关于这个主题的任何相关信息。

我的问题很简单:

我有 NHibernate 标准和投影,我正在尝试设置 DISTINCT ON(column)

我的投影代码如下:

        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

但不幸的是,如果此查询的性能非常非常差。

我优化了运行速度更快的 SQL,如下所示:

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

无论如何我可以让 NHibernate 生成我刚刚展示的 SQL 吗? 这个问题可以用 NHibernate 的方言解决吗?

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

【问题讨论】:

    标签: .net sql performance nhibernate postgresql


    【解决方案1】:

    无论如何,这不是最优雅的解决方案,但我想知道您是否可以通过使用“SQLProjection”来完成您需要的事情?我是一个 Java 人,所以代码可能不完全正确,但下面的方法看起来对我使用 Postgres 有效:

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

    这会生成您在问题中提供的优化 SQL 查询。同样,如果您正在做一些高度动态的事情,这种方法可能不起作用,但它是解决问题的一种方法。

    【讨论】:

      猜你喜欢
      • 2017-01-25
      • 2021-08-17
      • 1970-01-01
      • 2021-11-18
      • 1970-01-01
      • 2012-03-28
      • 2016-01-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多