代码之家  ›  专栏  ›  技术社区  ›  Jalal El-Shaer

如何使用MySQL日期插件nhibernate?

  •  2
  • Jalal El-Shaer  · 技术社区  · 15 年前

    这真的让我困惑了好几个小时,我在网上到处搜索,但没有找到有效的解决方案。有人能指出问题所在吗…谢谢! 我创建了自己的方言课

    public class MySQLDialectExtended : MySQLDialect
    {
        public MySQLDialectExtended()
        {
            RegisterFunction("date_add_interval", new SQLFunctionTemplate(NHibernateUtil.Date, "date_add(?1, INTERVAL ?2 ?3)"));            
        }
    }
    

    然后我尝试如下使用它:

    query.Append(
       " ( date_add_interval(D.ApprovalDate, 1, YEAR) < current_timestamp() <  date_add_interval(D.RenewalDate, -1, YEAR) )");
    

    失败,但有以下例外:

    NHibernate.Hql.Ast.ANTLR.QuerySyntaxException : Exception of type 'Antlr.Runtime.NoViableAltException' was thrown. near line 1, column 677
    

    其中,列号位于第一个“年份”字的末尾。

    编辑: 这是我的配置

        <property name="dialect">MyCompanyName.MySQLDialectExtended, MyCompanyName</property>
        <property name="hbm2ddl.keywords">none</property>
    
    1 回复  |  直到 15 年前
        1
  •  0
  •   Behrang Saeedzadeh    15 年前

    你能发布整个NHibernate查询吗?

    更新:嗯,查询显然是格式错误的:

    Select distinct D from MBIgnition.Core.Domain.Model.Deal D where 1=1 and 
    ( (D.MortgageStatus = 30 ) or 
      (D.MortgageStatus = 35 ) or 
      (D.MortgageStatus = 40 ) or 
      (D.MortgageStatus = 45 ) or 
      (D.MortgageStatus = 55 ) or 
      (D.MortgageStatus = 50 ) ) and 
      // next line is erroneous as the first AND operator does not have a lefthand side operand
    (( and ( date_add_interval(D.ApprovalDate, 1, YEAR) < current_timestamp() < date_add_interval(D.RenewalDate, -1, YEAR) ) ) )
    

    正如你所看到的,有一个 AND 代码中没有任何左侧参数的运算符。你的HQL应该有问题。再次检查它,如果您不能确定错误,那么在这里发布HQL或标准构建代码将非常有用。