【问题标题】:Hibernate Oracle INTERVAL EXPRESSION and Oracle 11g DialectHibernate Oracle INTERVAL EXPRESSION 和 Oracle 11g 方言
【发布时间】:2015-08-14 15:05:14
【问题描述】:

我需要对计算字段使用 INTERVAL EXPRESSION。如下:

@Formula(" SYSDATE - INTERVAL '1' HOUR * SHOW_LIMIT_HOURS ")
private Date showLimitDate;

然而,考虑到这个表达式就像一个列,hibernate 会生成以下 SQL 片段。

and product0_.sold_at > (
                SYSDATE - settings0_.INTERVAL '1' settings0_.HOUR * setting0_.SHOW_LIMIT_HOURS
            )

有人可以帮助我吗?

【问题讨论】:

    标签: hibernate oracle11g formula intervals


    【解决方案1】:

    苦了2天,分析了hibernate源码的AST处理终于放弃了!! =P .. 实际上还没有可用的 Oracle 11g 方言。

    所以,我改变了策略并通过以下更改来解决它:

    1.在Oracle数据库上创建follow函数

    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 方言类并注册新函数。

    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-29
      • 2011-05-21
      • 2012-03-05
      • 2014-11-04
      • 1970-01-01
      • 2011-08-21
      • 2011-07-08
      相关资源
      最近更新 更多