将SQL转换为NHibernate HQL

时间:2011-06-29 06:59:36

标签: sql nhibernate hql

我应该将转换为SQL-Query转换为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 个答案:

答案 0 :(得分:2)

开始使用的东西。

选择生日,从现在起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函数:

Register Custom SQL Function in NHibernate

然后,您应该能够在HQL中复制SQL查询。

这是关于SQL方面的一个很好的问题:

SQL Select Upcoming Birthdays


新鲜策略:

注册日期的SQL函数:

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

HQL查询

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>();

答案 1 :(得分:0)

未经测试,但会是这样的: <击>

<击>
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();

<击> 这样做了吗?


看一下源代码,楼层已经在方言中注册,所以如下:

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)