针对多列聚合子查询的聚合查询的NHibernate变通方法

时间:2013-03-28 15:19:51

标签: sql nhibernate subquery aggregate

我正在寻找一种在NHibernate中模拟以下查询的方法...

select total = count(*) from (
    select userId, reportId
    from RunHistory 
    where runDate >= @d
    group by userId, reportId
) t

我需要获取用户和报告的唯一报告运行总数,以便在分页查询中使用。问题是HQL不允许from子句中的子查询,我认为也不能使用Criteria / QueryOver。一种可能的解决方案是将两列配对并执行count(distinct pair_report_user_ids),但这看起来像是一个黑客。你能想到另一种方法来获取总数而不获取整个子查询结果并计算返回的行数吗?

我想我找到了way,在多列聚合查询中添加了count(*) over(),只选择了第一行!

select top 1 userId, reportId, total = count(*) over()
from RunHistory 
where runDate >= @d
group by userId, reportId

1 个答案:

答案 0 :(得分:0)

这是使用count(*) over SQL函数的方言特定QueryOver解决方案......

var countOverFunction = new NoArgSQLFunction("count(*) over", NHibernateUtil.Int32, true);

UserReportRunHistoryResult dto = null;

var result = s.QueryOver<RunHistory>()
    .SelectList(list => list
        .SelectGroup(x => x.user.id).WithAlias(() => dto.userId)
        .SelectGroup(x => x.report.id).WithAlias(() => dto.reportId)
        .Select(Projections.SqlFunction(countOverFunction, NHibernateUtil.Int32)).WithAlias(() => dto.total))
    .TransformUsing(Transformers.AliasToBean<UserReportRunHistoryResult>())
    .Take(1)
    .SingleOrDefault<UserReportRunHistoryResult>();