Setelah 2 hari menderita, menganalisis pemrosesan AST dari kode sumber hibernasi, saya akhirnya menyerah !! =P .. Sebenarnya dialek Oracle 11g belum tersedia.
Jadi , saya mengubah strategi dan menyelesaikannya dengan perubahan berikut :
1. Buat fungsi berikut pada database 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;
PETUNJUK DETERMINISTIK pada fungsi sangat penting untuk menghindari masalah kinerja saat menggunakannya di Where-Clauses. Info lebih lanjut tentang itu di tautan:http://www.inside-Oracle-apex.com/caution-when-using-plsql-functions-in-sql-statement/
2. Buat Kelas Dialek Oracle Kustom Dan Daftarkan Fungsi baru.
public class Oracle11gDialectExtended extends Oracle10gDialect {
public Oracle11gDialectExtended() {
super();
registerFunction("interval_hours_ago",
new StandardSQLFunction("INTERVAL_HOURS_AGO", StandardBasicTypes.DATE));
}
}
Jadi, sebut saja di @Formula :
@Formula(" INTERVAL_HOURS_AGO( SHOW_LIMIT_HOURS ) ")
private Date showLimitDate;
Atau di HQL / NamedQuery :
select p from Product p
where p.createdAt > interval_hours_ago(60)