2013-06-28 55 views
1

我有一个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的变化。

+0

对此有何想法?如果我无法使用它,它可能会使我使用自定义方言的整个设计失效...... – Matt

回答

0

我无法找到嵌套函数的工作方式,但是我想出了一个令人惊讶的简单解决方法。它缺少我所瞄准的代码重用(所以对所有函数都必须进行任何更改),但至少它允许我继续使用自定义方言。的

不是试图巢功能:

WHERE date_sub_days(GREATEST(:TRADE_HISTORY_MAX_DAYS,:ORDER_HISTORY_MAX_DAYS,:NEG_HISTORY_MAX_DAYS)) 

我创建一个单独的函数采取在多个参数:

WHERE date_sub_days_greatest(:TRADE_HISTORY_MAX_DAYS,:ORDER_HISTORY_MAX_DAYS,:NEG_HISTORY_MAX_DAYS) 

并嵌套在逻辑在方言级别:

SQLFunctionTemplate dateSubDaysFunction = new SQLFunctionTemplate(Hibernate.DATE, "SYSDATE - ?1"); 
registerFunction("date_sub_days", dateSubDaysFunction); 

SQLFunctionTemplate dateSubDaysGreatestFunction = new SQLFunctionTemplate(Hibernate.DATE, "SYSDATE - GREATEST(?1,?2,?3)"); 
registerFunction("date_sub_days_greatest", dateSubDaysGreatestFunction); 

希望能帮助别人!

相关问题