3

私は、「月曜日」または「木曜日」など、週に 1 日だけ開いている倉庫が格納されている Oracle データベースを持っています。

  • 倉庫が開いている日が整数として格納されます。日曜日は 0、土曜日は 6 として格納されます。
  • 各倉庫は、有効期間と呼ばれる特定の期間のみ開いています。この有効期間は、有効開始日と有効終了日の 2 つの日付として保存されます。たとえば、倉庫は 2011 年 1 月 1 日から 2011 年 2 月 28 日までの 2 か月間開いています。
  • ここで、特定の週に有効なすべての倉庫を選択したいと考えています。要求された週は日付として渡されます。この日付は常に日曜日、たとえば 2011 年 5 月 29 日であることが合意されています。これにより、次のクエリが生成されます。

      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 は、整数を日付に追加する日数として扱います。私の質問は、これをHQLで動作させることが可能かどうかです。

    休止状態でネイティブ SQL クエリを定義することもできます (既にこれを試してみましたが、これはうまくいきます) が、それは私が探している答えではありません。HQL ソリューションがあることを考えると、HQL ソリューションを探しているだけです。

    4

    1 に答える 1

    4

    解決策は、使用しているオラクルの方言をサブクラス化add_daysし、適切な SQL 変換を行う追加の関数を登録することです。

    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.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
    
    于 2011-05-24T12:28:36.120 に答える