Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Hibernate Oracle INTERVAL EXPRESSION dan Oracle 11g Dialect

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)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ora-01406 Kesalahan saat mengambil nilai menggunakan OCI

  2. Hitung perbedaan antara 2 tanggal / waktu di Oracle SQL

  3. BadImageFormatException dari penyedia oracle .net

  4. Kesalahan:Jenis Parameter tidak didukung dalam kode ADODB dari ASP klasik

  5. Oracle 11g:Hapus beberapa kolom dan sertakan nama kolom