Date 向HQL中日期类型的命名参数添加天数
我有一个oracle数据库,其中存储的仓库只在一周中的某一天开放,例如“星期一”或“星期四”。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
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
我正在使用命名查询。你能给我举个这样的例子吗?