【问题标题】:How to use SQL function in reference in NHibernate?如何在 NHibernate 中引用 SQL 函数?
【发布时间】:2011-11-13 22:04:49
【问题描述】:

我在 Oracle 上使用 Fluent NHibernate,我的问题是我必须在 where 条件下对每个字符串应用 lower() 函数。我做了我自己的方言,而不是使用 nls_lower 的 Oracle 较低功能。数据库主要由 Microsoft Dynamics AX 使用,此功能可提高性能。在像这样的标准查询中一切正常:

session.QueryOver<User>()
    .Where(x => x.Name.lower() == userName.lower())
    .SingleOrDefualt<User>();

但是我怎样才能在引用中应用这个 lower() 函数呢?我找不到任何适合这个的东西,我希望它可以以某种方式完成。我希望在映射类中有这样的东西,但我找不到它:

References<Settings>(x => x.Settings)
    .Column("SettingId").lower();

我不想立即将我的字符串转换为小写,但我确实需要生成这样的查询:

select * from User where nls_lower(Name) == nls_lower("somename");

谢谢!

【问题讨论】:

    标签: oracle nhibernate mapping fluent


    【解决方案1】:

    nls_lower 不是 Oracle 方言中的注册函数。
    您可以查看 Oracle8iDialect 类中的代码库。 在这种情况下,您必须注册自己的扩展。看看here

    当您注册了您的方言分机后,您应该可以这样称呼它:

    var filter1 = Restrictions.Eq(
        Projections.SqlFunction("nls_lower", NHibernateUtil.String,
        Projections.Property<User>(x => x.Name)), userName.ToLower());
    
    var user = session.QueryOver<User>();
    user.Where(myFilter)
        .SingleOrDefualt<User>();
    

    【讨论】:

    • 我知道它没有注册功能。就像我说的那样,我创建了 Oracle10gDialect 的子类,我在其中注册了这个函数并覆盖了标准的 lower 函数。这适用于标准查询。问题是如何使用 sql 函数(在本例中为 nls_lower)从引用生成查询。
    • @oFce:抱歉我的回复晚了。在我的回答中,我已经向您展示了将它与 QueryOver 一起使用的方式。没试过,但应该可以。
    • 感谢您的回复。这将只为属性名称生成应用 nls_lower。我希望它用于所有字符串属性。例如,我有引用实体用户的设置实体。对于这 2 个 SQL 查询,将生成 - 对于实体​​用户和受用户 ID 约束的实体设置。我想在实体设置的条件下应用 nls_lower。
    【解决方案2】:

    您可以定义自定义 SQL 来加载实体。见here

    【讨论】:

      猜你喜欢
      • 2013-03-04
      • 2011-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多