2012-06-11 163 views
0

比方說,我有一個截止日期提醒時間範圍。如何找到截止日期小於當前日期的人+使用Hibernate 3.6條件查詢提醒?換句話說,我想找到我顯示提醒的活動。當提醒應該在幾天或幾毫秒內發送時,提醒是一個長標記,以較容易的爲準。休眠和日期比較

總之,我的實體如下:

java.util.Date Event.DueDate 
Long Event.Type.Reminder.Before // (in days or millis) 

例子

Today is 2012-06-11. 
Included: 
    DueDate is 2012-06-15 and Before is 30 days. 
Excluded: 
    DueDate is 2012-06-15 and Before is 1 day. 

回答

0

歸根結底,這正是ANSI SQL調用日期/時間算術和具體情況,你正在尋找間隔數據類型處理。不幸的是,數據庫在支持INTERVAL數據類型方面差別很大。我真的很想在HQL中支持這一點(儘管這依賴於JPA規範委員會的協議)。就像我說的那樣,困難在於間隔的變化(如果有的話)。

的時刻(通過Hibernate 4.1)最好的辦法是提供要麼Dialect註冊(搜索谷歌,看看如何做到這一點),一個自定義函數org.hibernate.dialect.function.SQLFunction)或「自定義函數註冊表」 (org.hibernate.cfg.Configuration#addSqlFunction)。你可能想要這個以間隔的方式呈現給date-arith的數據庫特定表示。

下面是使用Oracle NUMTODSINTERVAL功能的例如

public class MySqlFunction implements SQLFunction 
{ 
    public Type getReturnType(Type firstArgumentType, 
           Mapping mapping) throws QueryException 
    { 
     return TimestampType.INSTANCE; 
    } 

    public String render(Type firstArgumentType, 
         List arguments, 
         SessionFactoryImplementor factory) throws QueryException 
    { 
     // Arguments are already interpreted into sql variants... 
     final String dueDateArg = arguments.get(0); 
     final String beforeArg = arguments.get(1); 

     // Again, using the Oracle-specific NUMTODSINTERVAL 
     // function and using days as the unit... 
     return dueDateArg + " + numtodsinterval(" + beforeArg + ", 'day')"; 
    } 

    public boolean hasArguments() { return true; } 
    public boolean hasParenthesesIfNoArguments() { return false; } 
} 

你會在HQL使用這個喜歡:

select ... 
from Event e 
where current_date() between e.dueDate and 
     interval_date_calc(e.dueDate, e.before) 

其中 'interval_date_calc' 是您註冊下其名稱的SQLFunction。