【问题标题】:NHibernate Formula based property + PostgreSQL interval基于 NHibernate 公式的属性 + PostgreSQL 间隔
【发布时间】:2015-06-30 20:20:54
【问题描述】:

我使用 NHibernate 和代码映射,我有一个由这个公式创建的属性。

Property(x => x.IsInOverdue,
    mapper => mapper
      .Formula("(SELECT (state_ <> 3 AND invoice_uniqueAlias.duedate_ < NOW()) " + 
               " FROM _invoice AS invoice_uniqueAlias  "+ 
               " WHERE invoice_uniqueAlias.invoice_id = issuedinvoice_key)"));

完美运行,这个 sql 在所有查询中作为子选择插入...

但我需要在 invoice_uniqueAlias.duedate_ 值上增加 1 天。我们使用的是 PostgreSQL,它的语法是:invoice_uniqueAlias.duedate_ + interval '1 day'

但是当我把它放在 mapper.Formula 中时,NHibernate 认为区间是列的名称,并且在所有查询中都尝试在区间关键字之前添加表前缀。生成的 SQL 如下所示:

... (SELECT (issuedinvo0_.state_ <> 3 
  AND (invoice_uniqueAlias.duedate_ + (issuedinvo0_.interval '1 day')) < NOW()) ...

我尝试将区间关键字放在 [, ` 中,将语句区间 + '1 天' 放在括号中,但没有帮助。任何建议如何在 NHibernate 中正确处理它,或者如何在不使用 + 间隔语法的情况下在 Postgres 中编写它?

【问题讨论】:

    标签: postgresql nhibernate nhibernate-mapping-by-code nhibernate-configuration


    【解决方案1】:

    如果我们需要 NHibernate 将某些词 (key words) 视为底层数据库引擎方言的一部分,我们必须对其进行扩展。

    一种方法是创建自定义方言:

    public class CustomPostgreDialect : PostgreSQL82Dialect
    {
        public CustomPostgreDialect()
        {
            RegisterKeyword("interval");
        }
    }
    

    现在只需使用它:

    <property name="dialect">My.Namespace.CustomPostgreDialect,My.Data</property>
    

    一些类似的问题 - Using SQL CONVERT function through nHibernate Criterion(使用类似的解决方案in this answer)

    【讨论】:

    • 太棒了! ;) 享受强大的 NHibernate,Jookyn!
    猜你喜欢
    • 2023-03-26
    • 2020-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-11
    • 2012-04-30
    • 1970-01-01
    相关资源
    最近更新 更多