Как использовать MySql date_add в Nhibernate? - PullRequest
2 голосов
/ 17 апреля 2010

Это действительно озадачило в течение нескольких часов, я искал по всему Интернету, но не получил никакого рабочего решения. Может кто-то указать, где проблема ... спасибо! Я создал свой собственный класс диалекта

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

где номер столбца находится в конце первого слова 'YEAR'.

Edit: вот моя конфигурация

    <property name="dialect">MyCompanyName.MySQLDialectExtended, MyCompanyName</property>
    <property name="hbm2ddl.keywords">none</property>

1 Ответ

0 голосов
/ 17 апреля 2010

Можете ли вы опубликовать весь запрос 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 или код построения критериев.

...