目录
零、前言
一、看错误提示
二、分析错误
三、定位问题
四、解决问题
Type Exception Report Message Request processing failed; nested exception is org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback; bad SQL grammar [delete from user_detail where username=?]; nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'username' in 'where clause' Description The server encountered an unexpected condition that prevented it from fulfilling the request.
零、前言
经常测试的一个网页,突然报错500。前面也没有发生过,但突然报错,只能先改错了,不然都没法进入页面。为什么会调用到存在bug的语句,而以前没有发生这种情况?这一问题没能想清楚,只能归咎于编译器了。
百度了很多,发现有很多类似的报错,但大家的错误并不一样。问题的产生都是个例,不能生搬硬套,需要根据错误提示和自己的工程代码对应进行改正。其他博主均是指出自己遇到的错误,并解决之,让新手的我看得似懂非懂,最后问题还是没解决。为此,我摸索了许久,终是解决了,在这里详细解释一下解决思路,如此也能给他人解决自己遇到的问题提供思路和方法。
一、看错误提示
Cause:
1、org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback; bad SQL grammar [delete from user_detail where username=?]
2、com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'username' in 'where clause'
二、分析错误
这里面涉及到了SQL语句,然后Unknown column 'username' in 'where clause'这说明是SQL语句与数据库表结构不统一导致的问题!即原因是未知的字段“username”,user_detail表中缺少字段!
首先在mysql中显示user_detail表结构和内容:
发现的确少了username字段。(为什么缺少该字段还要去操作该字段呢?)
三、定位问题
这里面user_detail表缺少字段username,是由于第一个问题中在user_detail表内操作了username字段。其实发生错误第一个错误往往是解决问题的关键,因此就去查询一下操作位置,发现delete操作是需要根据users表一起对应删除username的用户信息。而users表中是username
字段,而对应user_detail表中对应为real_name字段,从而引发的错误。
users表结构:
四、解决问题
找到调用函数位置,调用了removeUserDetail,然后对应找到removeUserDetail定义位置,并修改其中的操作字段。
//删除 userService.removeUser(localname); userService.removeUserDetail(localname);
改正之前:
public void removeUserDetail(String userName){ String sql = "delete from " + ModelMeta.USER_DETAIL + " where username=?"; this.genericEntityDao.update(sql, new Object[] { userName }); }
改正之后:
1.public void removeUserDetail(String userName){ String sql = "delete from " + ModelMeta.USER_DETAIL + " where real_name=?"; this.genericEntityDao.update(sql, new Object[] { userName }); }
修改后,HTTP Status 200就能正常访问页面了。