2日間悩んだ末、hibernateのソースコードのAST処理を解析してついに断念!! =P ..実際、Oracle 11g ダイアレクトはまだ利用できません。
そこで、戦略を変更し、次の変更で解決しました:
<強い>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;
関数の DETERMINISTIC HINT は、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)