我需要知道如何在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'
答案 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;