Oracle
 sql >> база данни >  >> RDS >> Oracle

Hibernate Oracle INTERVAL EXPRESSION и Oracle 11g Dialect

След 2 дни страдания, анализиране на AST обработката на изходния код на хибернация, най-накрая се отказах!! =P .. Всъщност все още няма наличен Oracle 11g Dialect.

И така, промених стратегията и го реших със следните промени:

1. Създайте функцията за следване в база данни на 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;

ДЕТЕРМИНИСТИЧНИЯТ СЪВЕТ относно функцията е много важен за избягване на проблеми с производителността, когато се използва за клаузи Where. Повече информация за него на връзката:http://www.inside-oracle-apex.com/caution-when-using-plsql-functions-in-sql-statement/

2. Създайте персонализиран клас на Oracle Dialect и регистрирайте новата функция.

public class Oracle11gDialectExtended extends Oracle10gDialect {

    public Oracle11gDialectExtended() {

        super();

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

    }
}

Така че, просто го извикайте на @Formula :

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

Или на 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. Грешка при вмъкване на данни с единични кавички между тях

  2. Oracle UTL_SMTP:Изпращане на поща с пример за прикачен файл с помощта на удостоверяване на Oracle Wallet

  3. oracle :Име на динамична колона

  4. BatchUpdateException:партидата няма да бъде прекратена

  5. Проблем с използването/показването на специални знаци от Oracle db в приложението .Net