我不能为我的生活找出如何使用NHibernate的Criteria API翻译以下SQL查询:
SELECT r.* from ContentItemVersionRecords as r
INNER JOIN (
SELECT ContentItemId as CID, Max(Number) as [Version]
FROM ContentItemVersionRecords
GROUP BY ContentItemId
) AS l
ON r.ContentItemId = l.CID and r.Number = l.[Version]
WHERE Latest = 0 and Published = 0
表格如下:
上面的SQL查询结果将返回突出显示的记录。 我们的想法是选择最新版本的内容项,因此我基本上需要按ContentItemId分组并获取最高数量的记录。
所以结果如下:
我从一个独立的标准开始,但我对如何在标准中使用它一无所知:
// Sub select for the inner join:
var innerJoin = DetachedCriteria.For<ContentItemVersionRecord>()
.SetProjection(Projections.ProjectionList()
.Add(Projections.GroupProperty("ContentItemId"), "CID")
.Add(Projections.Max("Number"), "Version"));
// What next?
var criteria = session.CreateCriteria<ContentItemVersionRecord>();
请注意,我必须使用Criteria API - 我不能使用LINQ,HQL或SQL。 这可以通过Criteria API实现吗?
更新:我刚遇到this post,看起来与我的问题非常相似。但是,当我按如下方式申请时:
var criteria = session
.CreateCriteria<ContentItemVersionRecord>()
.SetProjection(
Projections.ProjectionList()
.Add(Projections.GroupProperty("ContentItemId"))
.Add(Projections.Max("Number")))
.SetResultTransformer(Transformers.AliasToBean<ContentItemVersionRecord>());
我得到2个结果,看起来很有希望,但所有整数属性都是0:
更新2:我发现如果我提供别名,它会起作用(意味着我将获得带有填充对象的ContentItemVersionRecords列表):
var criteria = session
.CreateCriteria<ContentItemVersionRecord>()
.SetProjection(
Projections.ProjectionList()
.Add(Projections.Max("Id"), "Id")
.Add(Projections.GroupProperty("ContentItemId"), "ContentItemId")
.Add(Projections.Max("Number"), "Number"))
.SetResultTransformer(Transformers.AliasToBean<ContentItemVersionRecord>());
但是,我无法使用投影值作为最终结果 - 我需要将这些结果用作外部查询的某种输入,例如。
SELECT * FROM ContentItemVersionRecord WHERE Id IN ('list of record ids as a result from the projection / subquery / inner join')
但这不起作用,因为投影会返回3个标量值(Id,ContentItemId和Number)。如果它只是返回&#34; Id&#34;,那么它可能会起作用。但我需要其他两个投影按ContentItemId分组并按Max排序(&#34; Number&#34;)。
答案 0 :(得分:0)
好吧,简而言之,你需要展开嵌套查询,并使用having子句进行分组,这几乎就是聚合值的地方,如下面的HQL:
SELECT civ.ContentItem.Id, MAX(civ.Number) AS VersionNumber
FROM ContentItemVersionRecord civ
JOIN ContentItem ci
GROUP BY civ.ContentItem.Id " +
HAVING MAX(civ.Latest) = 0 AND MAX(civ.Published) = 0
这为您提供了每个已删除的内容项(其所有内容项版本记录中的所有最新和已发布标志为零),最大版本号,即每个已删除内容项的最新版本。