sql >> Base de Datos >  >> RDS >> Oracle

Hibernate Oracle INTERVALO EXPRESSION y Oracle 11g Dialecto

Después de 2 días de sufrimiento, analizando el procesamiento AST del código fuente de hibernación, ¡finalmente me di por vencido! =P .. De hecho, todavía no hay un dialecto de Oracle 11g disponible.

Entonces, cambié la estrategia y la resuelvo con los siguientes cambios:

1. Cree la función de seguimiento en la base de datos de 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;

SUGERENCIA DETERMINISTA sobre la función es muy importante para evitar problemas de rendimiento cuando se usa en cláusulas Where. Más información al respecto en el enlace:http://www.inside-oracle-apex.com/caution-when-using-plsql-functions-in-sql-statement/

2. Cree una clase de dialecto de Oracle personalizada y registre la nueva función.

public class Oracle11gDialectExtended extends Oracle10gDialect {

    public Oracle11gDialectExtended() {

        super();

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

    }
}

Entonces, solo llámalo en @Fórmula:

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

O en HQL / NamedQuery:

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