最终,这正是 ANSI SQL 所称的日期/时间算术,特别是您正在寻找INTERVAL数据类型处理。不幸的是,数据库对 INTERVAL 数据类型的支持差异很大。我真的想在 HQL 中支持这一点(可能还有标准,尽管这取决于 JPA 规范委员会的协议)。就像我说的那样,困难在于对间隔的各种(如果有的话)支持。
目前最好的选择(通过 Hibernate 4.1)是提供一个自定义函数(您可能希望它以间隔呈现给您的数据库特定的日期算法表示。org.hibernate.dialect.function.SQLFunction
Dialect
org.hibernate.cfg.Configuration#addSqlFunction
以下是使用 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 的名称。