Spring boot jpa H2兼容模式MYSQL不起作用

Posted

技术标签:

【中文标题】Spring boot jpa H2兼容模式MYSQL不起作用【英文标题】:Spring boot jpa H2 compatibility mode MYSQL not working 【发布时间】:2017-09-27 00:50:53 【问题描述】:

我在查询中使用了Date 函数,因此我试图在mysql 模式下为我的SpringBoot JPA 应用程序运行H2。我在我的application.yml 文件中添加了url: jdbc:h2:mem:testdb;Mode=MYSQL,因为我收到了错误org.h2.jdbc.JdbcSQLException: Function "DATE" not found; SQL statement

但即使在aplicaiton.ymll 文件中添加了mode=mysql 属性后,我仍然遇到同样的错误。还有什么我需要在任何地方添加的吗?

这是我的 Application.yml

spring: 
  datasource:
    url: jdbc:h2:mem:test;Mode=MYSQL

我的查询

@Query(value = "select * from user where  Date(created_date) <= ?1 and Date(modified_date) <= ?1", nativeQuery = true)
List<Users> usersByDate(String date );

我正在通过 spring/hibernate 使用我的实体中的 javax.persistence 注释创建表模式。我正在使用 spring-boot 1.4.2spring-data-jpa 1.10.5 。无法理解为什么它对我不起作用。

【问题讨论】:

就我个人而言,我总是使用实际的 DBMS 进行测试,我们总是在 Docker 镜像中运行测试,为每次测试运行提供一个干净的数据库。 你使用mode=MYSQL并不代表它100%支持mysql的所有特性和功能...查看H2文档兼容模式的作用。 【参考方案1】:

我能够完成这项工作(尽管感觉更像是一种黑客行为)。他们确实有一个实现,但出于某种原因,他们将其作为可插入模块提供。有问题的课程是这样的:https://github.com/h2database/h2database/blob/master/h2/src/main/org/h2/mode/FunctionsMySQL.java

最重要的是,这个类没有打包在当前可用的 maven jar 中。

所以我把它复制到我的源代码中。对于非弹簧用途,需要调用: FunctionsMYSQL.register(connection);

对于基于spring-jdbc的使用,由于我们不能直接访问java.sql.Connection,(在我的例子中是spring boot jdbc starter),这个sql需要在使用函数之前执行: CREATE ALIAS IF NOT EXISTS DATE FOR "org.h2.mode.FunctionsMySQL.date";

这个类也有 UNIX_TIMESTAMP 和 FROM_UNIXTIME 的实现。我通过将 UNIX_TIMESTAMP 插入 schema.sql(spring-jdbc 在开始时自动执行)来使用它。

【讨论】:

这是刚刚添加的。我一直在使用 1.4.197 并且该类不存在。我刚刚更新到 1.4.199 并且该类现在存在。

以上是关于Spring boot jpa H2兼容模式MYSQL不起作用的主要内容,如果未能解决你的问题,请参考以下文章

通过 Spring Boot JPA + Postgresql + H2 执行间隔

Spring Boot JPA 和 H2 记录未持久化

带有 H2 和 data.sql 的 Spring Boot Data JPA - 未找到表

使用 H2、JPA 注释和 Hibernate 问题的一对多关联

用于与 postgresql 在内存中兼容 h2 的 Spring Boot 属性

内存数据库spring-boot中的h2