Конвертировать SQL в NHibernate HQL - PullRequest
0 голосов
/ 29 июня 2011

Я должен преобразовать в следующий SQL-запрос в NHibernate HQL (NHibernate 3.2).Но я не знаю, как мне перевести FLOOR, DATEDIFF и GETDATE.

SELECT Birthday FROM Person
WHERE 1 = (FLOOR(DATEDIFF(dd,Birthday,GETDATE()+10) / 365.25))
      -
      (FLOOR(DATEDIFF(dd,Birthday,GETDATE()-5) / 365.25))

Ответы [ 2 ]

2 голосов
/ 29 июня 2011

С чего начать.

Выберите дни рождения, где день рождения от 5 дней до 10 дней.

    var today = DateTime.Now();
    var results = session.CreateQuery("select p.Birthday from Person 
        where p.Birthday>= :from and p.Birthday<=:to")
    .SetParameter("from", today.AddDays(10))
    .SetParameter("to", today.Subtract(new TimeSpan(5, 0, 0, 0)))
    .List<DateTime>();

Хотя я думаю, что вы хотите получать дни рождения независимо от года.

Чтобы реплицировать этот запрос на HQL, вам нужно зарегистрировать конкретные функции SQL, которые вам нужны, с помощью этой техники:

Регистрация пользовательской функции SQL в NHibernate

Тогда вы сможете повторить ваш SQL-запрос на HQL.

Это хороший вопрос на стороне SQL:

SQL Выберите предстоящие дни рождения


Свежая тактика:

Зарегистрировать функцию SQL для даты:

RegisterFunction("datediffdays", 
    new SQLFunctionTemplate(NHibernateUtil.Int32, "datediff(dd,?1, ?2)"));

HQL Query

var result = session.CreateQuery(@"from Person
     where 1 = (floor(datediffdays(Birthday,current_timestamp()+10) / 365.25))
    - (datediffdays(Birthday,current_timestamp()-5) / 365.25))")
.List<Person>();
0 голосов
/ 29 июня 2011

Не проверено, но хотелось бы что-то вроде:

var dateStart = DateTime.Now.AddDays(-5).Ticks/365.25D;
var dateEnd = DateTime.Now.AddDays(10).Ticks/365.25D;

session.QueryOver<Person>()
    .WhereRestrictionOn(x => x.Birthday.Ticks/365.25D)
         .IsBetween(dateStart).And(dateEnd)
    .List();

Это сделать то же самое?


Взглянув на исходный код, слово floor уже зарегистрировано на диалекте, поэтому следующее:

var result =
    session.CreateQuery(@"from Person 
                          where 1 = (FLOOR(DATEDIFF(dd,Birthday,GETDATE()+10) / 365.25))
                                        -
                                    (FLOOR(DATEDIFF(dd,Birthday,GETDATE()-5) / 365.25))")
           .List<Person>();

Создает следующий SQL:

select person0_.Id       as Id2_,
       person0_.Birthday as Birthday2_
from   [Person] person0_
where  1 = floor(DATEDIFF(dd,
                          person0_.Birthday,
                          GETDATE()
                            + 10)
                   / 365.25)
             - floor(DATEDIFF(dd,
                              person0_.Birthday,
                              GETDATE()
                                - 5)
                       / 365.25)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...