След 2 дни страдания, анализиране на AST обработката на изходния код на хибернация, най-накрая се отказах!! =P .. Всъщност все още няма наличен Oracle 11g Dialect.
И така, промених стратегията и го реших със следните промени:
1. Създайте функцията за следване в база данни на Oracle
CREATE OR REPLACE FUNCTION INTERVAL_HOURS_AGO(HOURS_PARAM IN NUMBER)
RETURN DATE DETERMINISTIC
IS TIME_AGO DATE;
BEGIN
SELECT (SYSDATE - INTERVAL '1' HOUR * HOURS_PARAM) INTO TIME_AGO FROM DUAL;
RETURN(TIME_AGO);
END;
ДЕТЕРМИНИСТИЧНИЯТ СЪВЕТ относно функцията е много важен за избягване на проблеми с производителността, когато се използва за клаузи Where. Повече информация за него на връзката:http://www.inside-oracle-apex.com/caution-when-using-plsql-functions-in-sql-statement/
2. Създайте персонализиран клас на Oracle Dialect и регистрирайте новата функция.
public class Oracle11gDialectExtended extends Oracle10gDialect {
public Oracle11gDialectExtended() {
super();
registerFunction("interval_hours_ago",
new StandardSQLFunction("INTERVAL_HOURS_AGO", StandardBasicTypes.DATE));
}
}
Така че, просто го извикайте на @Formula :
@Formula(" INTERVAL_HOURS_AGO( SHOW_LIMIT_HOURS ) ")
private Date showLimitDate;
Или на HQL / NamedQuery :
select p from Product p
where p.createdAt > interval_hours_ago(60)