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.2
和 spring-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 执行间隔
带有 H2 和 data.sql 的 Spring Boot Data JPA - 未找到表
使用 H2、JPA 注释和 Hibernate 问题的一对多关联