Spring Data JDBC 使用 Boot 2.3.0 生成错误的 HSQLDB 查询

Posted

技术标签:

【中文标题】Spring Data JDBC 使用 Boot 2.3.0 生成错误的 HSQLDB 查询【英文标题】:Spring Data JDBC Generating Bad HSQLDB Query with Boot 2.3.0 【发布时间】:2020-05-20 15:32:50 【问题描述】:

我有一个使用 Spring Data JDBC 的 Spring Boot 项目。测试使用 HSQLDB。当我尝试升级到 Spring Boot 2.3.0 时,我的存储库测试开始失败。

Spring Data JDBC 现在似乎引用了表名和列名。 Spring Boot 2.2.7 附带的 Spring Data JDBC 版本没有。

https://github.com/mrgrew/boot230bug 的项目展示了不同之处。 Spring Boot 2.3.0 生成 INSERT INTO "stats.counter" ("COUNTER_NAME") VALUES (?) 失败。 Spring Boot 2.2.7 生成 INSERT INTO stats.counter (counter_name) VALUES (?) 成功。

我猜 Spring Data JDBC 没有正确识别方言。我的测试属性指定了spring.datasource.platform=hsqldb,我认为这可以避免歧义。

似乎类似于 Spring Boot 2.3.0 中包含的 Spring Data JDBC 版本的错误。谁能确认这是一个错误或建议对我的演示项目进行更改以与 Boot 2.3.0 一起使用?

提前感谢您的任何建议或讨论!

【问题讨论】:

【参考方案1】:

看来我问得太快了...在我问这个问题的同一天发布了迁移指南! https://spring.io/blog/2020/05/20/migrating-to-spring-data-jdbc-2-0

迁移指南解释了我观察到的情况:

标识符的引用

Spring Data JDBC 1.x 主要使用表名和列名而不更改它们。当您使用 SQL 关键字作为属性或实体名称或尝试在列名称中使用某些特殊字符时,这会导致问题。

出于这个原因,Spring Data JDBC 2.0 默认引用所有标识符。这使得名称区分大小写,至少对于大多数数据库而言。由于默认情况下,我们还将生成的名称转换为数据库使用的默认字母大小写,这不会导致任何问题,假设您在 CREATE TABLE 语句中没有像大多数人那样使用引号。

从 Liquibase 更改日志中删除 @Table 注释和 schemaName 消除了我对引用的意外使用并解决了问题。作为奖励,我不再需要创建模式,因此我可以删除 spring.datasource.platform=hsqldb 和 schema-hsqldb.sql 文件。有关工作版本,请参阅 fixed 分支。

感谢Jens Schauder的轻推!

【讨论】:

很高兴看到迁移指南有所帮助。请您直接在答案中添加解决您的问题的部分。目前,这是一个“仅限链接”的答案,在 SO 社区中不受欢迎,因为链接可能会失效,这会使答案变得无用。

以上是关于Spring Data JDBC 使用 Boot 2.3.0 生成错误的 HSQLDB 查询的主要内容,如果未能解决你的问题,请参考以下文章

Spring Data JDBC 使用 Boot 2.3.0 生成错误的 HSQLDB 查询

Spring Boot / Data 通过 jdbc UCanAccess 连接到 MS Access

使用 spring-data-jpa 和完整的 tomcat-jdbc 配置的 spring boot 为 ResetAbandonedTimer 抛出 java.lang.ClassNotFound

独立使用时 spring-boot-starter-jdbc 的问题

基于spring-boot-data-jdbc的RowMapper实例的初始化配置,配置内容和实体类的代码由测试类生成

Spring Boot 2.x基础教程:使用Spring Data JPA访问MySQL