sql >> Databáze >  >> RDS >> Oracle

Hibernace Oracle INTERVAL EXPRESSION a Oracle 11g Dialect

Po 2 dnech utrpení, analýze AST zpracování zdrojového kódu hibernace jsem to konečně vzdal!! =P .. Ve skutečnosti ještě není dostupný dialekt Oracle 11g.

Změnil jsem tedy strategii a řeším to následujícími změnami:

1. Vytvořte funkci sledování v databázi 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;

DETERMINISTICKÁ NÁPOVĚDA na funkci je velmi důležitá, aby se předešlo problémům s výkonem při jejím použití v klauzulích Where. Více informací o něm na odkazu:http://www.inside-oracle-apex.com/caution-when-using-plsql-functions-in-sql-statement/

2. Vytvořte vlastní třídu Oracle Dialect a zaregistrujte novou funkci.

public class Oracle11gDialectExtended extends Oracle10gDialect {

    public Oracle11gDialectExtended() {

        super();

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

    }
}

Takže to zavolejte na @Formula :

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

Nebo na HQL / NamedQuery :

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



  1. MySQL přeformátovat výsledek mysql tak, aby vyhovoval json hansontable

  2. Vyberte počet odpovědí MCQ na základě odpovědi na předchozí otázku

  3. Načítání CSV dat do PostgreSQL tabulky

  4. Oracle:exportuje pouze schéma