You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Spring Tool Suite进行TDD时执行用户控制器测试出现SQL语法错误求助

使用Spring Tool Suite进行TDD时执行用户控制器测试出现SQL语法错误求助

嘿,我一眼就看出问题出在哪啦!你遇到的SQL语法错误是因为数据库表名踩了SQL的保留关键字坑,我来给你梳理清楚问题和解决办法~

先看你给出的失败栈核心错误:

org.springframework.dao.InvalidDataAccessResourceUsageException: could not prepare statement [Syntax error in SQL statement "select u1_0.id,u1_0.display_name,u1_0.password,u1_0.username from [*]user u1_0"; expected "identifier"; SQL statement: select u1_0.id,u1_0.display_name,u1_0.password,u1_0.username from user u1_0 [42001-232]]

问题根源

你的User实体类没有指定数据库表名,JPA默认会用类名的小写user作为表名,但user是SQL标准里的保留关键字,几乎所有数据库(比如你测试用的H2)都不允许直接把关键字当表名用,这就触发了语法错误。

两种解决办法,任你选:

方法1:给实体类指定合法表名(推荐)

这是最通用稳妥的方式,直接在User实体类上加上@Table注解,换一个非关键字的表名,比如users:

import javax.persistence.Entity;
import javax.persistence.Table;

@Entity
@Table(name = "users") // 用users替代user,避开关键字冲突
public class User {
    // 你的实体字段(id、username、displayName等)
    // 对应的getter/setter方法
}

修改后重新运行测试,Hibernate生成的SQL就会用users作为表名,语法错误自然就消失了。

方法2:配置Hibernate自动转义关键字(应急可用)

要是你暂时不想改表名,可以在测试环境的配置文件src/test/resources/application-test.properties里加个配置:

# 让Hibernate给所有表名、列名自动加引号,兼容关键字
spring.jpa.properties.hibernate.globally_quoted_identifiers=true

这个配置会让生成的SQL变成select ... from "user" u1_0,用引号把关键字表名括起来,数据库就能正确识别。不过这种方式兼容性略差,不同数据库的引号规则可能不一样,还是更推荐方法1。

最后验证

不管选哪种方式,改完后重新跑你的两个测试方法,应该就能顺利通过,不会再出现SQL语法错误啦!

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.08 07:48:02