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

MySQL插入数据触发SQLSyntaxErrorException问题求助

解决MySQL插入时的SQLSyntaxErrorException(rank关键字冲突)

问题根源

你碰到的java.sql.SQLSyntaxErrorException本质是**rank是MySQL的保留关键字**!从异常信息里的near 'rank) values (300.0, 'rahul', 20)'能看出来,Hibernate自动生成的插入SQL里直接把rank当列名使用,没有做转义处理,导致MySQL识别成关键字,触发语法错误。

快速解决方案

你只需要在Users实体类的rank字段注解里,给列名加上反引号(`)转义,或者直接修改列名避开关键字即可:

方案1:给列名加反引号(推荐,无需改数据库)

假设你的Users实体类里rank字段的注解是这样的:

@Column(name = "rank")
private Integer rank;

修改为:

@Column(name = "`rank`")
private Integer rank;

这样Hibernate生成的SQL会自动把列名用反引号包裹,变成INSERT INTO users (marks, name, rank) VALUES (...),完美避开关键字冲突。

方案2:修改数据库列名

如果允许调整数据库结构,可以把表中的rank列改成非关键字名称(比如user_rank),同步修改实体类注解:

@Column(name = "user_rank")
private Integer rank;

额外的逻辑小修正

顺带提一句,你的Service层里状态判断逻辑搞反了:

// 原代码
if(status==0){
    statusObject.setStatus(true); // 失败却返回true
    statusObject.setMessage("Failed to insert data");
    return statusObject;
}else{
    statusObject.setStatus(false); // 成功却返回false
    statusObject.setMessage("Success to insert data");
    return statusObject;
}

应该调整为:

if(status==0){
    statusObject.setStatus(false);
    statusObject.setMessage("Failed to insert data");
    return statusObject;
}else{
    statusObject.setStatus(true);
    statusObject.setMessage("Success to insert data");
    return statusObject;
}

这个小问题不影响插入,但会导致前端拿到的状态和描述不一致,建议修正。

内容的提问来源于stack exchange,提问作者AbhiRam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:10:14