sql >> Database teknologi >  >> RDS >> Oracle

Dvale Oracle INTERVAL EXPRESSION og Oracle 11g Dialect

Efter 2 dages lidelse og analyse af AST-behandling af dvalekildekode gav jeg endelig op !! =P .. Faktisk er der ikke en Oracle 11g Dialect tilgængelig endnu.

Så jeg ændrede strategien og løser den med følgende ændringer:

1. Opret følgefunktionen på Oracle-database

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;

DETERMINISTISK TIP om funktion er meget vigtigt for at undgå ydeevneproblemer, når du bruger det på Where-Clausules. Mere info om det på linket:http://www.inside-oracle-apex.com/caution-when-using-plsql-functions-in-sql-statement/

2. Opret en brugerdefineret Oracle Dialect-klasse og registrer den nye funktion.

public class Oracle11gDialectExtended extends Oracle10gDialect {

    public Oracle11gDialectExtended() {

        super();

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

    }
}

Så kald det bare på @Formel :

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

Eller på HQL / NamedQuery :

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



  1. C# og MySQL .NET Connector - Enhver måde at forhindre SQL Injection-angreb på i en generisk klasse?

  2. Hvordan man vælger fra mysql array tekst og sammenligner

  3. Henvis til et alias andetsteds i SELECT-listen

  4. Hvordan forespørger du en int-kolonne for enhver værdi?