2010-04-17 74 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