2011-05-24 8 views
2

私は、倉庫が格納されている倉庫が格納されています。 'monday'または 'thursday'。 HQLでDate型の名前付きパラメータに日を追加する

  • 倉庫が開いている日は整数として格納されます。日曜日は0、土曜日は6として保存されます。
  • 各倉庫は、有効期間として知られている一定の期間だけ開かれます。この有効期間は、有効期限開始日と有効期限終了日の2つの日付として保存されます。例えば。倉庫は2011年1月1日から2011年2月28日まで2ヶ月間開かれています。今
  • 私は、特定の週のための有効なすべての倉庫を選択します。要求された週は日付として渡されます。この日は常に日曜日になることが合意されています。 5月29日、2011これは、次のクエリにつながる:

    from Warehouse w 
    where (:requested_week_date + w.day_open) between w.valid_start and w.valid_end 
    

    問題は、このクエリは、クラスのキャスト例外を与えるということである。

    java.lang.ClassCastException: java.util.Date incompatible with java.lang.Integer 
    

    事は水の下で、Oracleが付加することができるということです整数を日付に変換します。 Oracleは日付に追加する日数として整数を扱います。私の質問は、をHQLで動作させることが可能かどうかです。

    あなたはまた、ハイバーネイトでネイティブSQLクエリを定義することができます(すでにこれを試してみましたが、これはうまくいきます)。しかし、それは私が探している答えではありません。私はHQLソリューションを探しています。

    ソリューションは、あなたが使用しているオラクルの方言をサブクラス化し、適切なSQLの翻訳を行うだろう追加 add_days機能に登録することかもしれません

    答えて

    3

    :今すぐ方言クラスが定義されていることを

    package foo.bar; 
    
    import org.hibernate.dialect.Oracle10gDialect; 
    import org.hibernate.dialect.function.SQLFunctionTemplate; 
    import org.hibernate.type.StandardBasicTypes; 
    
    public class MyOracleDialect extends Oracle10gDialect { 
        @Override 
        protected void registerFunctions() { 
         super.registerFunctions(); 
         registerFunction("add_days", new SQLFunctionTemplate(StandardBasicTypes.DATE, "(?1 + ?2)")); 
        } 
    } 
    

    を、このクラスを使用しますあなたのHibernate設定:

    hibernate.dialect=foo.bar.MyOracleDialect 
    

    そして、次のHQLクエリを使用します。

    from Warehouse w 
        where add_days(:requested_week_date, w.day_open) between w.valid_start and w.valid_end 
    
    +0

    私は名前付きクエリを使用しています。これがどうなるかの例を教えてください。 –

    +0

    @H。 van de Kamp:例を示すために私の答えを編集しました –

    関連する問題