Efter 2 dagars lidande och analyserat AST-bearbetning av källkod i viloläge gav jag äntligen upp !! =P .. Det finns faktiskt ingen Oracle 11g Dialect tillgänglig än.
Så jag ändrade strategin och löser den med följande ändringar:
1. Skapa följningsfunktionen på Oracle-databasen
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;
DETERMINISTISKT TIPS om funktion är mycket viktigt för att undvika prestandaproblem när du använder den på Where-Clausules. Mer information om det på länken:http://www.inside-oracle-apex.com/caution-when-using-plsql-functions-in-sql-statement/
2. Skapa en anpassad Oracle Dialect Class och registrera den nya funktionen.
public class Oracle11gDialectExtended extends Oracle10gDialect {
public Oracle11gDialectExtended() {
super();
registerFunction("interval_hours_ago",
new StandardSQLFunction("INTERVAL_HOURS_AGO", StandardBasicTypes.DATE));
}
}
Så, ring det bara på @Formula :
@Formula(" INTERVAL_HOURS_AGO( SHOW_LIMIT_HOURS ) ")
private Date showLimitDate;
Eller på HQL / NamedQuery :
select p from Product p
where p.createdAt > interval_hours_ago(60)