sql >> データベース >  >> RDS >> Oracle

Hibernate Oracle INTERVAL EXPRESSION と Oracle 11g ダイアレクト

    2日間悩んだ末、hibernateのソースコードのAST処理を解析してついに断念!! =P ..実際、Oracle 11g ダイアレクトはまだ利用できません。

    そこで、戦略を変更し、次の変更で解決しました:

    <強い>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;
    

    関数の DETERMINISTIC HINT は、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. mysqldを停止する方法

    2. 2つのフィールドの組み合わせでグループ化し、各グループの合計で並べ替え、複数の注釈django

    3. LINESTERMINATEDBYおよびFIELDSTERMINATEDBYの複数の可能性-MySQL

    4. 複数のテーブルに対する複数の FULL OUTER JOIN