【问题标题】:Custom SQL function for NHibernate dialectNHibernate 方言的自定义 SQL 函数
【发布时间】:2010-12-23 04:26:56
【问题描述】:

我希望能够在我的 HQL 中调用一个名为“recent_date”的自定义函数。像这样:[Date] >= recent_date()

我创建了一个新的方言,继承自 MsSql2000Dialect 并为我的配置指定了方言。

public class NordicMsSql2000Dialect : MsSql2000Dialect
{
    public NordicMsSql2000Dialect()
    {
        RegisterFunction(
            "recent_date",
            new SQLFunctionTemplate(
                NHibernateUtil.Date,
                "dateadd(day, -15, getdate())"
                )
            );
    }
}

var configuration = Fluently.Configure()
.Database(
    MsSqlConfiguration.MsSql2000
    .ConnectionString(c => .... )
    .Cache(c => c.UseQueryCache().ProviderClass<HashtableCacheProvider>())
    .Dialect<NordicMsSql2000Dialect>()
)
.Mappings(m => ....)
.BuildConfiguration();

调用recent_date() 时出现以下错误: System.Data.SqlClient.SqlException: 'recent_date' 不是可识别的函数名称

我在下面的 HasMany 映射的 where 语句中使用它。

HasMany(x => x.RecentValues)
    .Access.CamelCaseField(Prefix.Underscore)
    .Cascade.SaveUpdate()
    .Where("Date >= recent_date()");

我在这里错过了什么?

【问题讨论】:

    标签: nhibernate fluent-nhibernate hql


    【解决方案1】:

    我认为,Where 是 SQL 语句,而不是 HQL 语句。所以它不知道功能。它仅适用于 HQL,在查询或过滤器中。

    【讨论】:

    • 对不起,关于那个。我应该明确表示“SELECT .... FROM SomeTable WHERE ....”只是一个例子。我们不会在代码中使用该部分。
    • 答案表明,映射中的 .Where 需要纯 SQL 而不是任何形式的 HQL。
    【解决方案2】:

    我认为您必须在函数前加上“dbo”。每当你使用它。 我的自定义方言是这样的:

    RegisterFunction("dbo.isbounded", new SQLFunctionTemplate(NHibernateUtil.Double, "dbo.IsBounded(?1, ?2, ?3, ?4, ?5, ?6)"));
    

    然后使用

    调用它
    Expression.Sql("dbo.IsBounded(...)")
    

    【讨论】:

    • 谢谢。但这适用于上面的 HasMany where 语句吗?根据下面的链接, where="" 只能包含普通的旧 SQL。我不得不寻求不同的解决方案,因为我需要完成我正在开发的功能。 groups.google.com/group/fluent-nhibernate/browse_thread/thread/…
    • 你得到一个 SQL 异常的事实表明 NHibernate 正在将它传递给 sql 引擎,因此它不是 NHibernate 识别函数的问题。因此,我会说是的。就 where 子句而言,只采用原始 sql;如果是这种情况,那么您根本不必注册该函数,只需在 where 子句中直接输入“dbo.recent_date()”即可。
    • 我认为这不会起作用,因为 SQLite(据我所知)不支持自定义函数。我需要使用 MsSql 和 SQLite 的解决方案,并且我希望在方言级别上做到这一点。有什么想法吗?
    • 我不确定您为什么要为不支持它们的数据库引擎注册自定义 SQL 函数。方言的重点是将其与引擎的功能相匹配。这就是为什么方言是每个数据库引擎的原因。
    • 好吧,说实话,我认为使用 RegisterFunction 注册的函数是由 NHibernate 处理的,并且 NHibernate 在将其发送到数据库之前解析了其背后的 SQL。所以我想 RegisterFunction 根本不是要走的路。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-18
    • 2014-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多