歸根結底,這正是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。