我有一个oracle数据库,其中存储的仓库仅在一周内的某一天开放,例如'星期一'或'星期四'。
现在我想选择给定周的所有有效仓库。请求的周期作为日期传递。大家一致同意,这个日期总是有些星期天,例如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解决方案,只要有一个。
答案 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