关于H2

时间:2018-03-06 14:07:39

标签: mysql spring spring-data-jpa h2

我在Spring Boot(& spring data JPA)应用程序中使用h2进行测试。

我每天都存储某种统计信息,因此我设置了ON DUPLICATE KEY UPDATE查询来存储这些统计信息。如果在给定的一天内没有存储任何内容,请创建一个新条目。如果这一天已经在数据库中,只需增加其值即可。

架构:

CREATE TABLE statistic (
  id BIGINT PRIMARY KEY AUTO_INCREMENT,
  my_date DATE UNIQUE,
  value_1 INTEGER DEFAULT 0,
  value_2 INTEGER DEFAULT 0,
  value_3 INTEGER DEFAULT 0,
  ...
  value_X INTEGER DEFAULT 0
)

回购:

@Modifying
@Query(value = "INSERT INTO statistic (value_X, my_date) SELECT :valueX,, :myDate " +
        "ON DUPLICATE KEY UPDATE value_X, = value_X, + :valueX,", nativeQuery = true)
void saveOrIncrementValueX(@Param("valueX") Integer valueX, @Param("myDate") LocalDate myDate);

最后我调整了H2,因此使用了mySQL模式

my_schema.datasource.jdbcUrl: jdbc:h2:mem:my_schema;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE;MODE=MYSQL

当我运行一个只是尝试在同一天多次存储值的测试时,它第一次工作,然后抛出一个异常,说明正在插入一个重复的键:

o.h.engine.jdbc.spi.SqlExceptionHelper   : SQL Error: 23505, SQLState: 23505
o.h.engine.jdbc.spi.SqlExceptionHelper   : Unique index or primary key violation: "UK_SQNR5X4KWWB6W0IXLL4HURKTF_INDEX_2 ON PUBLIC.STATISTIC(MATCH_DATE) VALUES (DATE '2018-03-06', 1)"; SQL statement:
    INSERT INTO statistic (version_ok, match_date) SELECT ?, ? ON DUPLICATE KEY UPDATE version_ok = version_ok + ? [23505-185]
o.s.s.s.TaskUtils$LoggingErrorHandler    : Unexpected error occurred in scheduled task.
org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint ["UK_SQNR5X4KWWB6W0IXLL4HURKTF_INDEX_2 ON PUBLIC.STATISTIC(MATCH_DATE) VALUES (DATE '2018-03-06', 1)"; SQL statement:
    INSERT INTO statistic (version_ok, match_date) SELECT ?, ? ON DUPLICATE KEY UPDATE version_ok = version_ok + ? [23505-185]]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement

我敢打赌我的SQL支持在H2中没有完全正常运行,但是我错过了什么吗?我能做些什么来使“ON DUPLICATE KEY”正常工作吗?

编辑:我看了this post,但我有一个不同的错误。

0 个答案:

没有答案