在HQL中为Date类型的命名参数添加天数

时间:2011-05-24 12:03:41

标签: date hql add named-parameters days

我有一个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解决方案,只要有一个。

    1 个答案:

    答案 0 :(得分: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)"));
        }
    }
    

    现在定义了dialect类,在你的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