Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Hibernate Oracle INTERVAL EXPRESSION und Oracle 11g Dialect

Nach 2 Tagen Leiden und Analysieren der AST-Verarbeitung des Hibernate-Quellcodes habe ich endlich aufgegeben !! =P .. Tatsächlich ist noch kein Oracle 11g Dialect verfügbar.

Also habe ich die Strategie geändert und es mit folgenden Änderungen gelöst:

1. Erstellen Sie die folgende Funktion in der Oracle-Datenbank

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;

DETERMINISTISCHER HINWEIS zur Funktion ist sehr wichtig, um Leistungsprobleme zu vermeiden, wenn sie in Where-Klauseln verwendet werden. Mehr Infos dazu unter Link:http://www.inside-oracle-apex.com/caution-when-using-plsql-functions-in-sql-statement/

2. Erstellen Sie eine benutzerdefinierte Oracle Dialect-Klasse und registrieren Sie die neue Funktion.

public class Oracle11gDialectExtended extends Oracle10gDialect {

    public Oracle11gDialectExtended() {

        super();

       registerFunction("interval_hours_ago", 
           new StandardSQLFunction("INTERVAL_HOURS_AGO", StandardBasicTypes.DATE));

    }
}

Rufen Sie es also einfach auf @Formula :

auf
@Formula(" INTERVAL_HOURS_AGO( SHOW_LIMIT_HOURS ) ")
private Date showLimitDate;

Oder auf HQL / NamedQuery :

select p from Product p 
  where p.createdAt > interval_hours_ago(60)