2011-05-24 62 views
2

我有一个oracle数据库,其中存储的仓库只能在一周内的某一天打开, '星期一'或'星期四'。 将日期添加到HQL中的Date类型的命名参数

  • 仓库打开的那天存储为整数。星期天存储为0,星期六为6.
  • 每个仓库仅在给定的时间段内开放,即其有效期。该有效期限被存储为两个日期,有效开始日期和有效结束日期。例如。从2011年1月1日至2011年2月28日,仓库将开放两个月。
  • 现在我要选择所有有效的仓库对于给定的一周。请求的星期通过日期。已经同意这个日期总会是一些星期天,例如, 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会将该整数作为天数添加到日期中。我的问题是,如果可以在HQL中使此工作

    我知道你也可以在hibernate中定义原生的sql查询(已经试过了,这个效果很好),但那不是我正在寻找的答案。我只是寻找一个HQL解决方案,因为有一个。

    回答

    3

    一个解决办法可能是继承你使用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配置:

    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

    我正在使用命名查询。你能给我一个这样的例子吗? – 2011-05-24 13:27:55

    +0

    @H。 van de Kamp:我编辑了我的答案给你看一个例子 – 2011-05-24 14:28:27