Oracle
 sql >> Base de données >  >> RDS >> Oracle

Hibernate Oracle INTERVAL EXPRESSION et Oracle 11g Dialect

Après 2 jours de souffrance à analyser le traitement AST du code source d'hibernation, j'ai finalement abandonné !! =P .. En fait, il n'y a pas encore de dialecte Oracle 11g disponible.

Donc, j'ai changé la stratégie et je l'ai résolue avec les modifications suivantes :

1. Créez la fonction de suivi sur la base de données 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;

INDICE DETERMINISTE sur la fonction est très important pour éviter les problèmes de performances lors de son utilisation sur les clauses WHERE. Plus d'infos à ce sujet sur le lien :http://www.inside-oracle-apex.com/caution-when-using-plsql-functions-in-sql-statement/

2. Créez une classe de dialecte Oracle personnalisée et enregistrez la nouvelle fonction.

public class Oracle11gDialectExtended extends Oracle10gDialect {

    public Oracle11gDialectExtended() {

        super();

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

    }
}

Alors, appelez-le simplement sur @Formula :

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

Ou sur HQL / NamedQuery :

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