【问题标题】:Use CURRENT_DATE() in @Formula in Oracle and H2在 Oracle 和 H2 的 @Formula 中使用 CURRENT_DATE()
【发布时间】:2020-04-03 12:13:30
【问题描述】:

我之前的问题因重复而关闭

Use sysdate in @Formula in Oracle and H2

建议的解决方案:

How to use current date in H2 database SQL query

我已经尝试过 CURRENT_TIMESTAMP:

@Formula("FLOOR(CURRENT_TIMESTAMP() - last_date)")
private Long daysSinceLastDate;

它正在与嵌入式 H2 数据库进行集成测试,但正在运行应用程序 Oracle:

Caused by: java.sql.SQLException: ORA-30088: datetime/interval precision is out of range

CURRENT_TIMESTAMP() 在 Oracle 中根本不起作用,CURRENT_TIMESTAMP 在 H2 中也不起作用。

【问题讨论】:

    标签: java oracle hibernate h2


    【解决方案1】:

    我在@Where 子句中遇到了同样的问题。我需要类似的东西

    @Entity
    @Where(clause = "open_date <= current_date")
    public class SomeEntity {
    
        // omitted
    
    }
    

    并且由于 Oracle 和 H2 都具有针对 current_timestamp 的输入精度的功能,因此

    @Entity
    @Where(clause = "open_date <= current_timestamp(6)")
    public class SomeEntity {
    
        // omitted
    
    }
    

    为我工作。这里的6是默认值,所以相当于Oracle中的current_timestamp和H2中的current_timestamp()

    【讨论】:

      【解决方案2】:

      如果您可以从当前来源构建 H2,则可以使用

      CAST(CURRENT_DATE - LAST_DATE AS INT)
      

      或特定于 Oracle 的

      FLOOR(SYSDATE - LAST_DATE)
      

      从你之前的问题。

      Oracle 18c 也接受这两种变体。

      您可以在 GitHub 上获取 H2 的源代码:

      https://github.com/h2database/h2database

      使用jar 目标,如下所述:

      https://h2database.com/html/build.html#building

      不要使用 H2 的 Maven 构建,它只是实验性的。

      【讨论】:

      • 谢谢,但我采用了不同的方法。我会添加一个答案
      【解决方案3】:

      我已经在集成测试数据源配置中添加了拦截器。

      @Bean
      public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
          HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
          vendorAdapter.setDatabase(Database.H2);
          vendorAdapter.setGenerateDdl(false);
          vendorAdapter.setShowSql(true);
      
          LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();
          entityManagerFactoryBean.setJpaVendorAdapter(vendorAdapter);
          entityManagerFactoryBean.setDataSource(dataSource());
          entityManagerFactoryBean.setPersistenceProviderClass(HibernatePersistenceProvider.class);
      
          Properties properties = new Properties();
          properties.setProperty(Environment.FORMAT_SQL, "false");
          **properties.put(Environment.INTERCEPTOR, hibernateInterceptor());**
          entityManagerFactoryBean.setJpaProperties(properties);
      
          return entityManagerFactoryBean;
      }
      
      @Bean
      public EmptyInterceptor hibernateInterceptor() {
          return new EmptyInterceptor() {
              @Override
              public String onPrepareStatement(String sql) {
                  String query = super.onPrepareStatement(sql);
                  query = query.replace("projaudit0_.sysdate", "CURRENT_DATE()");
                  return query;
              }
          };
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-10-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-25
        • 2019-08-15
        相关资源
        最近更新 更多