我有一个hibernate模型需要支持多个数据库(MySQL,Oracle,Sybase等)并且有一些日期逻辑。回顾各种论坛/帖子,我遇到了为Hibernate创建自定义方言和注册函数的想法,并为每种方言提供了特定于数据库的逻辑。这些工作精美(只显示相关的位 - 道歉提前,我只好模糊一些价值观和字段名称后的):我可以在Hibernate自定义方言中嵌套函数吗?
public MyOracle10gDialect() {
super();
SQLFunctionTemplate sqlFunctionTemplate =
new SQLFunctionTemplate(Hibernate.DATE, "SYSDATE - ?1");
registerFunction("date_sub_days", sqlFunctionTemplate);
}
public MyMySQLDialect() {
super();
SQLFunctionTemplate sqlFunctionTemplate =
new SQLFunctionTemplate(Hibernate.DATE, "DATE_SUB(UTC_TIMESTAMP(),INTERVAL ?1 DAY)");
registerFunction("date_sub_days", sqlFunctionTemplate);
}
但是现在我需要用一个函数来解决参数通过这个函数。不幸的是,我无法访问使用此模型的代码,否则我只会将逻辑移入代码中,但是有什么方法可以执行嵌套函数吗?我想用'GREATEST(x,y,z)'作为我的'date_sub_days'函数的参数。我基本上想要这个工作和失败:
WHERE date_sub_days(GREATEST(:TRADE_HISTORY_MAX_DAYS,:ORDER_HISTORY_MAX_DAYS,:NEG_HISTORY_MAX_DAYS)) < value1
,因为它不解决'最大'的功能成一个单一的参数。
在MySQL中,我得到以下打印到控制台:
Hibernate:
select blah from blah where
DATE_SUB(UTC_TIMESTAMP(),INTERVAL GREATEST(? DAY) < value1
ERROR util.JDBCExceptionReporter - Parameter index out of range (2 > number of parameters, which is 1).
而在Oracle中,我得到以下打印到控制台:
Hibernate:
select blah from blah where
SYSDATE - GREATEST(?<value1
ERROR util.JDBCExceptionReporter - Invalid column index
很想听听你对如何实现这一点建议无论是方言还是HQL的变化。
对此有何想法?如果我无法使用它,它可能会使我使用自定义方言的整个设计失效...... – Matt