NHibernate Criteria SQL内部连接在Sub上选择相同的表

时间:2014-10-24 07:12:34

标签: sql-server nhibernate inner-join criteria

我不能为我的生活找出如何使用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

表格如下:

latest versions to be returned

上面的SQL查询结果将返回突出显示的记录。 我们的想法是选择最新版本的内容项,因此我基本上需要按ContentItemId分组并获取最高数量的记录。

所以结果如下:

latest versions returned

我从一个独立的标准开始,但我对如何在标准中使用它一无所知:

// 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:

enter image description here

更新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;)。

1 个答案:

答案 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

这为您提供了每个已删除的内容项(其所有内容项版本记录中的所有最新和已发布标志为零),最大版本号,即每个已删除内容项的最新版本。