-1

这可能相当简单,但我似乎无法在任何文档中找到合理的解释。

我正在尝试使用 NHibernate.ISQLQuery 并使用 SetResultTransformer() 从自定义 SQL 查询返回一组自定义结果。像这样:

    public virtual IList<T> GetSQLObject<T>(string sql, IDbParameter[] parameters = null)
    {
        ISQLQuery qry = _sess.CreateSQLQuery(sql);

        qry.SetResultTransformer(Transformers.AliasToBean(typeof(T)));    

        if (parameters != null) {
            foreach (IDbParameter parameter in parameters) {
                qry.SetParameter(parameter.Name, parameter.Value);
            }
        }

        return qry.List<T>();
    }

通过查看示例,似乎在 sql 查询中我必须使用:param1格式的参数,而不是像在标准 SQL 查询中那样使用@param1 。如果我在查询中使用后一种语法,它会在 qry.SetParameter() 处引发错误。

ISQLQuery/NHibernate 是否有理由要求它们采用这种格式并且不能使用正常语法?

4

2 回答 2

3

SQL Server 使用@param,但并非所有其他数据库都使用。例如,MySQL 使用 ?param

NHibernate 允许您将 1 个数据库实现换成另一个,而几乎不需要修改 DAL。它根据您在设置 NH 配置时配置的数据库设置参数。

编辑:我也认为 :param 来自 Hibernate 在最初开发时针对 Oracle,因为 Oracle 使用 :param

于 2010-12-13T07:03:12.463 回答
0

菲尔回答了“为什么”;所以也许我可以推荐一个“如何”;为什么不向IDbParameter类型(类似.GetNHibernateName())添加一个新的扩展方法,该方法将返回参数名称,其中“@”替换为“:”;这应该很容易实现。

于 2010-12-13T20:26:44.960 回答