gpt4 book ai didi

nhibernate - 多对一公式将表名附加到 SQL 关键字

转载 作者:行者123 更新时间:2023-12-04 01:35:35 25 4
gpt4 key购买 nike

我正在使用遗留数据库并尝试将 char 转换为 int 以进行多对一映射。我知道这不是一个好主意,但我坚持使用架构。

我已尝试使用以下映射来执行此操作,但发现 NHibernate 将表名别名添加到关键字 SQL_INTEGER 上。

<many-to-one name="host" formula="CONVERT(alloc_code, SQL_INTEGER)" />

生成 SQL

CONVERT(hostplacem0_.alloc_code, hostplacem0_.SQL_INTEGER)

我找到了 this发布,但解决方案对我的情况不可行。

需要注意的一件事是,我们已经为我们使用的 DBMS(Sybase Advantage 数据库服务器)推出了我们自己的方言,因为 NHibernate 不支持开箱即用。因此,我可以选择修改它来解决这个问题。我已经尝试将 SQL_INTEGER 注册为关键字,但这没有帮助。

最佳答案

在花了几个小时浏览 NHibernate 源代码后,我终于能够确定为什么 RegisterKeyword("SQL_INTEGER") 不起作用。 Template.RenderWhereStringTemplate 方法用于生成公式 SQL。此方法在它处理的每个字符串标记上调用 ToLowerInvariant(),因此当该方法检查保留关键字列表时,它会查找 sql_integer,因此找不到它。在我们的自定义方言中更改对 RegisterKeyword("sql_integer") 的调用后,生成了正确的 SQL:

CONVERT(hostplacem0_.alloc_code, SQL_INTEGER)

为了完整性,我还检查了是否可以通过访问 SessionFactoryImpl 中的方言类并通过反射调用 RegisterKeyword 来注入(inject)新关键字,即

var factory_impl = factory as SessionFactoryImpl;
if (factory_impl != null)
{
MethodInfo mInfoMethod = typeof(Dialect).GetMethod(
"RegisterKeyword",
BindingFlags.Instance | BindingFlags.NonPublic,
Type.DefaultBinder,
new[] { typeof(string) },
null);

mInfoMethod.Invoke(factory_impl.Dialect, new object[] { "sql_integer" });
}

虽然这段代码有效,但 NHibernate 仍然发出不正确的 SQL。不幸的是,每当使用 Dialect.GetDialect 方法请求方言对象时,NHibernate 似乎都会创建一个新的方言实例。

我想解决这个问题的唯一方法就是做我们所做的事情。完全创建您自己的方言,就像我们的情况一样,或者通过从现有方言进行子类化并将对 RegisterKeyword 的调用添加到构造函数中。

关于nhibernate - 多对一公式将表名附加到 SQL 关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15480140/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com