首页 > 解决方案 > Spring Data JDBC 使用 Boot 2.3.0 生成错误的 HSQLDB 查询

问题描述

我有一个使用 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 一起使用?

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

标签: spring-bootspring-data-jdbc

解决方案


看起来我问得太快了......在我问这个问题的同一天发布了迁移指南!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=hsqldbschema-hsqldb.sql 文件。请参阅工作版本的固定分支。

感谢您轻推Jens Schauder


推荐阅读