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
相关产品推荐
相关产品推荐

