基于 NHibernate 公式 属性 + PostgreSQL 区间
NHibernate Formula based property + PostgreSQL interval
我将 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 认为 interval 是列的名称,并且在所有查询中都试图在 interval 关键字之前添加 table 前缀。生成的 SQL 看起来像:
... (SELECT (issuedinvo0_.state_ <> 3
AND (invoice_uniqueAlias.duedate_ + (issuedinvo0_.interval '1 day')) < NOW()) ...
我试过在[ `, put statement interval + '1 day' 中加上interval关键字,但是没用。关于如何在 NHibernate 中正确处理它或如何在不使用 + 间隔语法的情况下在 Postgres 中编写它有什么建议吗?
以防万一,我们需要 NHibernate 将某些单词 (key 单词) 作为底层数据库引擎方言的一部分,我们有只是扩展它。
一种方法是创建自定义方言:
public class CustomPostgreDialect : PostgreSQL82Dialect
{
public CustomPostgreDialect()
{
RegisterKeyword("interval");
}
}
现在就用它:
<property name="dialect">My.Namespace.CustomPostgreDialect,My.Data</property>
一些类似的问题 - Using SQL CONVERT function through nHibernate Criterion (with the similar solution in this answer)
我将 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 认为 interval 是列的名称,并且在所有查询中都试图在 interval 关键字之前添加 table 前缀。生成的 SQL 看起来像:
... (SELECT (issuedinvo0_.state_ <> 3
AND (invoice_uniqueAlias.duedate_ + (issuedinvo0_.interval '1 day')) < NOW()) ...
我试过在[ `, put statement interval + '1 day' 中加上interval关键字,但是没用。关于如何在 NHibernate 中正确处理它或如何在不使用 + 间隔语法的情况下在 Postgres 中编写它有什么建议吗?
以防万一,我们需要 NHibernate 将某些单词 (key 单词) 作为底层数据库引擎方言的一部分,我们有只是扩展它。
一种方法是创建自定义方言:
public class CustomPostgreDialect : PostgreSQL82Dialect
{
public CustomPostgreDialect()
{
RegisterKeyword("interval");
}
}
现在就用它:
<property name="dialect">My.Namespace.CustomPostgreDialect,My.Data</property>
一些类似的问题 - Using SQL CONVERT function through nHibernate Criterion (with the similar solution in this answer)