【问题标题】:SELECT MAX() with JOIN in NHibernate在 NHibernate 中使用 JOIN 选择 MAX()
【发布时间】:2010-06-04 18:59:28
【问题描述】:

我有一个供应商。每个供应商都有几个 Reservations,上面有一个 ReservationDate。

我想要一份今天尚未进行预订的供应商列表。

在 SQL 中,我会这样做:

SELECT v.Id, MAX(r.ReservationDate) AS MaxDate FROM Vendor v 
INNER JOIN DailyReservation r ON v.Id = r.Vendor_Id
GROUP BY v.Id
HAVING MAX(r.ReservationDate) <> '2010-06-04'

我正在尝试在 NHibernate 中这样做:

session.CreateCriteria<Vendor>()
                    .CreateAlias("Reservations", "r")
                    .SetProjection(Projections.Alias(Projections.Max("r.ReservationDate"), "MaxDate"))
                    .Add(Restrictions.Not(Restrictions.Eq("MaxDate", DateTime.Today)))
                    .List<Vendor>();

这显然行不通。我做错了什么?

编辑!我又玩了一些,到了这一点,效果更好:

var c = Session.CreateCriteria<Vendor>();
c.CreateAlias("Reservations", "r");

ProjectionList projections = Projections.ProjectionList();
projections.Add(Projections.Max("r.ReservationDate"), "MaxDate");
projections.Add(Projections.GroupProperty("Id"));
c.SetProjection(projections);
c.Add(Restrictions.Not(Restrictions.Eq("MaxDate", DateTime.Today)));

return c.List<Vendor>();

为了回答评论,我收到错误“NHibernate.QueryException: could not resolve property: MaxDate of: Vendor”

【问题讨论】:

  • 你遇到了什么错误?
  • 您使用 Criteria 而不是 HQL 的任何特殊原因?
  • @Jon,我已经编辑了这个问题。 @Mauricio,不是真的。我没有使用 HQL,所以我使用我所知道的(稍微好一点)。

标签: join nhibernate group-by max having


【解决方案1】:

正如 Mauricio 所提到的,HQL 更适合解决这个问题。

这是您的查询:

session.CreateQuery(
  @"
  SELECT v.Id, MAX(r.ReservationDate)
  FROM Vendor v
  JOIN v.Reservations r
  GROUP BY v.Id
  HAVING MAX(r.ReservationDate) <> :MaxDate
  ")
  .SetParameter("MaxDate", DateTime.Today)
  .List();

如您所见,它与 SQL 没有太大区别,除了 NH 已经知道关系这一事实,因此您不必为 Join 指定字段。

但要考虑的一点是,此查询不返回Vendor 的列表。它返回一个object[] 的列表,其中每一行包含两个元素:Id 和 MAX 投影。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多