最終的に、これはANSI SQLが日付/時刻演算と呼ぶものであり、具体的にはINTERVALデータ型の処理を探しています。残念ながら、データベースはINTERVALデータ型のサポートによって大きく異なります。私は本当にこれをHQLでサポートしたいと思っています(そしておそらく基準ですが、それはJPA仕様委員会の合意に依存しています)。私が言ったように、難しさは間隔のさまざまな(もしあれば)サポートです。
現時点で(Hibernate 4.1を介して)最善の策は、 (これがどのように行われるかを確認するためにグーグルを検索)または「カスタム関数レジストリ」( )のいずれかに登録されたカスタム関数( )を提供することです。おそらく、これをデータベース固有の日付-arithの表現に間隔を置いてレンダリングする必要があります。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を登録したときの名前です。