3

我有一个 oracle 数据库,其中存储的仓库仅在一周中的某一天开放,例如“星期一”或“星期四”。

  • 仓库开放的日期以整数形式存储。星期日存储为 0,星期六存储为 6。
  • 每个仓库只在给定的时间段内开放,称为其有效期。该有效期被存储为两个日期,一个有效期开始日期和一个有效期结束日期。例如,仓库从 2011 年 1 月 1 日到 2011 年 2 月 28 日开放两个月。
  • 现在我想选择给定一周的所有有效仓库。请求的周作为日期传递。一致认为该日期将始终是某个星期日,例如 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 能够将整数添加到日期。Oracle 会将整数视为添加到日期的天数。我的问题是是否有可能让它在 HQL中工作。

    我知道你也可以在 hibernate 中定义本地 sql 查询(已经尝试过这个并且效果很好),但这不是我正在寻找的答案。鉴于有一个,我只是在寻找一个 HQL 解决方案。

    4

    1 回答 1

    4

    一个解决方案可能是将您正在使用的 oracle 方言子类化并注册一个附加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 回答