【问题标题】:JPA delete older records than x days and write tests for it with H2JPA 删除早于 x 天的记录并使用 H2 为其编写测试
【发布时间】:2022-07-20 22:44:44
【问题描述】:

我想从历史记录表中删除早于 x 天的数据。每行都有一个日期字段。到目前为止,我只设法使用本机查询来做到这一点。

public interface HistoryItemRepository extends PagingAndSortingRepository<HistoryItem, Long> {
  @Modifying
  @Query(
    nativeQuery = true,
    value = "DELETE FROM history_item hi WHERE trunc(hi.timestamp AT TIME ZONE 'EUROPE/HELSINKI') <= trunc(current_timestamp AT TIME ZONE 'EUROPE/HELSINKI') - 7"
  )
  Integer removeOldHistoryItems();
}

应用程序本身在 Oracle DB 上运行,这种方法运行良好。然而,测试运行 H2 数据库,因此当测试运行调用此方法的代码时,我得到 org.h2.jdbc.JdbcSQLException Syntax error in SQL statement "DELETE FROM HISTORY_ITEM HI WHERE TRUNC(HI.TIMESTAMP AT[*] TIME ZONE 'EUROPE/HELSINKI') &lt;= TRUNC(CURRENT_TIMESTAMP AT TIME ZONE 'EUROPE/HELSINKI') - 7 "; expected "(, ., [, ::, *, /, %, +, -, ||, ~, !~, NOT, LIKE, ILIKE, REGEXP, IS, IN, BETWEEN, AND, OR, ,, )"; SQL statement:

我可以做些什么来测试它?可以将此查询转换为不需要本机查询的内容吗?

【问题讨论】:

    标签: java jpa junit h2


    【解决方案1】:

    timestamp AT TIME ZONE 'time zone name' 受支持,因为旧的不受支持的 H2 1.4.200,看起来您使用了一些需要升级的旧版本。

    请注意,IANA (Olson) 时区名称在 H2 中区分大小写,需要指定为 'Europe/Helsinki',否则会出现未知时区 ID 异常。

    【讨论】:

      猜你喜欢
      • 2015-02-17
      • 1970-01-01
      • 1970-01-01
      • 2020-03-11
      • 1970-01-01
      • 1970-01-01
      • 2014-02-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多