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.
4

1 に答える 1

0

最終的に、これはANSI SQLが日付/時刻演算と呼ぶものであり、具体的にはINTERVALデータ型の処理を探しています。残念ながら、データベースはINTERVALデータ型のサポートによって大きく異なります。私は本当にこれをHQLでサポートしたいと思っています(そしておそらく基準ですが、それはJPA仕様委員会の合意に依存しています)。私が言ったように、難しさは間隔のさまざまな(もしあれば)サポートです。

現時点で(Hibernate 4.1を介して)最善の策は、 (これがどのように行われるかを確認するためにグーグルを検索)または「カスタム関数レジストリ」( )のいずれかに登録されたカスタム関数( )を提供することです。おそらく、これをデータベース固有の日付-arithの表現に間隔を置いてレンダリングする必要があります。org.hibernate.dialect.function.SQLFunctionDialectorg.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を登録したときの名前です。

于 2012-06-11T15:30:14.287 に答える