Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Hibernate Oracle INTERVAL EXPRESSION và Oracle 11g Dialect

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)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách lấy dữ liệu BLOB bằng Oracle ODBC

  2. Sao lưu trực tuyến Vs ngoại tuyến

  3. Oracle - sql_text bị cắt ngắn còn 20 ký tự cho câu lệnh CREATE / ALTER / GRANT?

  4. Thực thi một thủ tục được lưu trữ của Oracle trong EntityFramework

  5. Cách kiểm tra Oracle Client được cài đặt hay không là điều kiện tiên quyết để cài đặt thành phần