spring - 如何在H2数据库中使用MySQL特有的函数?

标签 spring unit-testing spring-boot h2 spring-test

如何将包含 @Formula 字段的实体持久保存到 H2 数据库?

我遇到以下异常:

...
Caused by: org.h2.jdbc.JdbcSQLException: Function "UNIX_TIMESTAMP" not found;
...

课后:

@Entity
public class Post {
    // ...

    @Formula("UNIX_TIMESTAMP(creation_date_time) / 24 * 60 * 60 * 1000 + likes_count")
    private long score;

    // ...
}

PostRepositoryTest 类:

@ExtendWith(SpringExtension.class)
@DataJpaTest
class PostRepositoryTest {

    @Autowired
    private TestEntityManager entityManager;

    @Autowired
    private PostRepository postRepository;

    @Test
    void savePost() {
        entityManager.persist(new Post());

        List<Post> posts = postRepository.findAll();

        assertEquals(1, posts.size());
    }
}

最佳答案

根据https://h2database.com/html/features.html#user_defined_functions ,您可以在 src/test/resources/import.sql 中定义这样的函数:

CREATE ALIAS IF NOT EXISTS UNIX_TIMESTAMP FOR "acme.H2Function.unixTimestamp";

并定义这个类:

package acme;

public class H2Function {

  public static long unixTimestamp(java.sql.Timestamp timestamp) {
    return timestamp.getTime() / 1000L;
  }
}

当您开始单元测试时,Spring JPA 将自动调用 import.sql。

NOTE: Must naming import.sql, not schema.sql, not data.sql

关于spring - 如何在H2数据库中使用MySQL特有的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52217563/

相关文章:

java - 通过配置类创建事务管理器和实体管理器

spring - 是否可以在spring elasticsearch中使用_update_by_query

c# - 如何在c# Mvc中编写单元测试?方法有 session

java - springboot总是从主数据源读取数据

java - Mac 上缺少 spring-boot-starter-web hibernate-validator 依赖项

java - Spring Boot/JPA - 数据行级授权

集群redis中的spring security redis token 存储

unit-testing - Robolectric + 艾玛 : Initialization Error

angular - JS,单元测试 : expect on a callback

java - 如何使用 Hibernate 进行大量插入?