Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Date 向HQL中日期类型的命名参数添加天数_Date_Hql_Add_Named Parameters_Days - Fatal编程技术网

Date 向HQL中日期类型的命名参数添加天数

Date 向HQL中日期类型的命名参数添加天数,date,hql,add,named-parameters,days,Date,Hql,Add,Named Parameters,Days,我有一个oracle数据库,其中存储的仓库只在一周中的某一天开放,例如“星期一”或“星期四”。 仓库打开的日期存储为整数。星期日存储为0,星期六存储为6 每个仓库只在给定的时间内开放,称为其有效期。此有效期存储为两个日期:有效期开始日期和有效期结束日期。例如,从2011年1月1日到2011年2月28日,仓库开放两个月。 现在我想选择给定一周的所有有效仓库。请求的周作为日期传递。双方同意,该日期始终为某个星期日,例如2011年5月29日。这将导致以下查询: from Warehouse

我有一个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将把整数视为添加到日期的天数。我的问题是,是否有可能在HQL中实现这一点


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

    解决方案可能是对您正在使用的oracle方言进行子类化,并注册一个额外的
    add\u 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
    

    我正在使用命名查询。你能给我举个这样的例子吗?