2010-04-17 34 views
2

这真的困惑了几个小时,我在互联网上搜索,但没有工作的解决方案。有人可以指出问题所在......谢谢! 我创造了我自己的方言类如何在Nhibernate中使用MySql的date_add?

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> 

回答

0

你能张贴整个NHibernate的查询?

UPDATE:嗯,查询显然是畸形的,错误的:

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或标准构建代码将非常有用。

+0

它的一个长查询和无关的问题,我创建了一个较短的版本 类型'Antlr.Runtime.NoViableAltException'的异常被抛出。靠近第1行,第266列[从MBIgnition.Core.Domain.Model.Deal D选择不同的D,其中1 = 1和((D.MortgageStatus = 30)或(D.MortgageStatus = 35)或(D.MortgageStatus = 40) (D.MortgageStatus = 45)或(D.MortgageStatus = 55)或(D.MortgageStatus = 50))和((和(date_add_interval(D.ApprovalDate,1,YEAR)) 2010-04-17 13:24:35

+0

你说得对,那个查询格式不正确。我修好了,但仍然出现这个错误: NHibernate.Hql.Ast.ANTLR.QuerySyntaxException:抛出了类型为'Antlr.Runtime.NoViableAltException'的异常。第1列133列[从MBIgnition.Core.Domain.Model.Deal D选择不同的D,其中1 = 1和((1 = 1且(date_add_interval(D.ApprovalDate,1,YEAR) 2010-04-18 17:10:27