You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

咨询NHibernate是否支持Partition By Over子句及QueryOver写法

NHibernate对Partition By Over子句的支持及QueryOver实现

是否支持RANK()/ROW_NUMBER()的Partition By Over子句

NHibernate 3.0及以上版本原生支持使用ROW_NUMBER()、RANK()这类窗口函数的Partition By Over子句,你可以通过SQL投影的方式在QueryOver查询中直接使用这类语法。

目标SQL对应的QueryOver查询实现

首先需要定义一个用于接收查询结果的DTO类(如果不需要强类型结果,也可以跳过这一步直接返回匿名类型):

public class OrderLineResult
{
    public string OrderNumber { get; set; }
    public int OrderLine { get; set; }
}

接下来编写QueryOver查询代码,通过Projections.SqlProjection嵌入窗口函数:

// 初始化DTO用于别名映射
var resultDto = new OrderLineResult();

var queryResult = session.QueryOver<Table1>()
    .SelectList(select => select
        // 映射ORDERNUMBER字段到DTO的OrderNumber属性
        .Select(entity => entity.OrderNumber).WithAlias(() => resultDto.OrderNumber)
        // 嵌入ROW_NUMBER()窗口函数SQL,指定别名、列名和数据类型
        .Select(Projections.SqlProjection(
            "ROW_NUMBER() OVER (PARTITION BY this_.ORDERNUMBER) as orderline",
            new[] { "orderline" },
            new IType[] { NHibernateUtil.Int32 }
        )).WithAlias(() => resultDto.OrderLine)
    )
    // 将查询结果转换为DTO对象
    .TransformUsing(Transformers.AliasToBean<OrderLineResult>())
    .List<OrderLineResult>();

关键细节说明

  • Projections.SqlProjection用于直接自定义SQL片段,这里嵌入了窗口函数逻辑,同时指定了返回列的名称和NHibernate数据类型
  • WithAlias配合Transformers.AliasToBean实现查询结果到DTO的自动映射
  • 确保实体Table1的OrderNumber属性与数据库字段ORDERNUMBER的映射关系正确
  • 窗口函数的语法需匹配你使用的数据库(如SQL Server、PostgreSQL等,语法基本一致)

内容的提问来源于stack exchange,提问作者Manjusha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 20:56:03