Sau 2 ngày đau khổ, phân tích AST xử lý mã nguồn ngủ đông cuối cùng tôi cũng bó tay !! =P .. Trên thực tế, vẫn chưa có phương thức Oracle 11g.
Vì vậy, tôi đã thay đổi chiến lược và giải quyết nó bằng những thay đổi sau:
1. Tạo hàm theo dõi trên cơ sở dữ liệu 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;
GỢI Ý XÁC ĐỊNH về chức năng là rất quan trọng để tránh vấn đề về hiệu suất khi sử dụng nó trên Điều khoản ở đâu. Thông tin khác về nó trên liên kết: http://www.inside-oracle-apex.com/caution-when-using-plsql-functions-in-sql-statement/
2. Tạo một lớp phương ngữ Oracle tùy chỉnh và đăng ký hàm mới.
public class Oracle11gDialectExtended extends Oracle10gDialect {
public Oracle11gDialectExtended() {
super();
registerFunction("interval_hours_ago",
new StandardSQLFunction("INTERVAL_HOURS_AGO", StandardBasicTypes.DATE));
}
}
Vì vậy, chỉ cần gọi nó trên @Formula:
@Formula(" INTERVAL_HOURS_AGO( SHOW_LIMIT_HOURS ) ")
private Date showLimitDate;
Hoặc trên HQL / NamedQuery:
select p from Product p
where p.createdAt > interval_hours_ago(60)