Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Hibernacja Oracle INTERVAL EXPRESSION i dialekt Oracle 11g

Po 2 dniach cierpienia, analizując przetwarzanie AST kodu źródłowego hibernacji, w końcu się poddałem !! =P .. W rzeczywistości nie jest jeszcze dostępny dialekt Oracle 11g.

Zmieniłem więc strategię i rozwiązałem ją następującymi zmianami:

1. Utwórz funkcję śledzenia w bazie danych 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;

WSKAZÓWKA DETERMINISTICZNA dotycząca funkcji jest bardzo ważna, aby uniknąć problemów z wydajnością podczas używania jej w klauzulach Where. Więcej informacji na ten temat pod linkiem:http://www.inside-oracle-apex.com/caution-when-using-plsql-functions-in-sql-statement/

2. Utwórz niestandardową klasę dialektu Oracle i zarejestruj nową funkcję.

public class Oracle11gDialectExtended extends Oracle10gDialect {

    public Oracle11gDialectExtended() {

        super();

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

    }
}

Więc po prostu zadzwoń na @Formuła :

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

Lub w HQL / NamedQuery :

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak uzyskać liczbę wierszy, których dotyczy instrukcja, gdy znajduje się w wyzwalaczu tego oświadczenia?

  2. Znajdź wszystkie węzły w modelu listy sąsiedztwa z Oracle connect by

  3. Dlaczego PHP OCI8/Oracle oci_bind_array_by_name nie działa dla mnie?

  4. Sekcja inicjowania pakietu

  5. Tworzenie wyzwalacza, który zgłasza wyjątek przy wstawianiu