摘要:介绍下环境在Hibernate项目中我使用了Hql字符串拼接的方法来控制sql的查询,所以这里自然而然的产生了这种错误。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
org.hibernate.exception.SQLGrammarException: could not extract ResultSet
......
at org.hibernate.hql.internal.classic.QueryTranslatorImpl.list(QueryTranslatorImpl.java:941)
at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:236)
at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1300)
at org.hibernate.internal.QueryImpl.list(QueryImpl.java:103)
at com.platform.common.dao.impl.BaseDao.getListByHQL(BaseDao.java:265)
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'XXXX' in 'where clause'
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:389)
at com.mysql.jdbc.Util.getInstance(Util.java:372)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:980)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3835)

当你看到【Unknown column ‘XXXX’ in ‘where clause’】这个错误的时候不要直接潜意识的就想单从字面理解,我们很容易得出列名不存在的结论,但是,很多时候起始并不是由于列名出错造成的。而是由于拼凑sql语句时对字符类型数据没有用引号引起来造成的。
所以首先要明确看到这个错误的时候要想的是:where后面的条件中使用了一个不正确的字段名XXXX.这样想更容易让我们解决问题。

好了回归正题,这个问题其实是由于sql中如果字段是整型的倒不会出现什么错误,而如果sql中字符串类型必须要包含在引号内

在项目中我使用了字符串拼接的方法来控制sql的查询,所以这里自然而然的产生了这种错误。来看例子

1
2
3
4
5
6
7
String name = "小明";
String sql = " and hs.name = " + name ;//这样是错误的

//应该修改为
String sql = " and hs.name = '" + name +"'";//这样是对的
//或者是
String sql = " and hs.name = "' + name +'"';//其实就是要将这个内容使用引号包起来