需要NHibernate中复杂SQL查询的帮助

时间:2009-11-12 01:26:47

标签: c# .net nhibernate

我需要知道如何在NHibernate的ICriteria格式中重写以下SQL查询。它基本上是一种模仿MS-SQL的RANK()功能的方法,只返回那些最新的结果。

SELECT a.Name, a.Value, a.CreationDate
FROM MyTable a
WHERE EXISTS
(
  SELECT NULL
  FROM
  (
    SELECT TOP 1 CreationDate
    FROM MyTable
    WHERE Name = a.Name
    ORDER BY CreationDate DESC
  ) b
  WHERE b.CreationDate = a.CreationDate
)

例如,给定一个包含以下数据的表:

NAME,VALUE,CREATIONDATE
'Key One','value one v1','2009-11-11'
'Key One','value one v2','2009-11-12'
'关键二','价值二v1','2009-11-09'
'关键三','价值三v2','2009-09-09'
'关键三','价值三v1','2009-09-06'
'关键三','价值三v3','2009-10-01'

上述查询的结果将是:

'Key One','value one v2','2009-11-12'
'关键二','价值二v1','2009-11-09'
'关键三','价值三v3','2009-10-01'

1 个答案:

答案 0 :(得分:0)

当复杂的查询,不使用“Criteria API”而是“HQL”时,您可能会失去大量时间来使用“Criteria API”找到正确的解决方案。您显示的查询几乎可以无需更改即可使用。看看这个:https://www.hibernate.org/hib_docs/nhibernate/html/queryhql.html

最后,生成的代码通常与“Criteria API”或“HQL”相同......

一段代码:

StringBuilder query = new StringBuilder();
query.Append("from MyTable where ");
query.Append("DateOfDayStart <= :startDate and DateOfDayEnd >= :endDate ");
IList<MyTable> list = session.CreateQuery(query.ToString())
    .SetDateTime("startDate", startDate)
    .SetDateTime("endDate", endDate)
    .List<MyTable>();
return list;