sql与hql的问题

时间:2022-01-17 23:12:42
myeclipse7.0+sql server2008+SSH框架


底层代码如下:

@SuppressWarnings("unchecked")
public List<Pic_Keyword> findAll() {
String hql="from Pic_Keyword pic_keyword order by pic_keyword.pic_id desc";
//String hql="select pic_id,key_id,analyse from Pic_Keyword order by pic_id";
return (List<Pic_Keyword>)this.getHibernateTemplate().find(hql);
}

错误提示为:
2011-1-8 22:58:17 org.apache.catalina.core.StandardWrapperValve invoke
严重: Servlet.service() for servlet default threw exception
com.microsoft.sqlserver.jdbc.SQLServerException: 'Index' 附近有语法错误。如果它要作为表提示的一部分,则必须有 WITH 关键字和圆括号。有关正确的语法,请参阅 SQL Server 联机丛书。
at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:197)
at com.microsoft.sqlserver.jdbc.SQLServerStatement.getNextResult(SQLServerStatement.java:1493)
at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.doExecutePreparedStatement(SQLServerPreparedStatement.java:390)
at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement$PrepStmtExecCmd.doExecute(SQLServerPreparedStatement.java:340)
at com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:4575)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:1400)
at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeCommand(SQLServerStatement.java:179)
at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeStatement(SQLServerStatement.java:154)
at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.executeQuery(SQLServerPreparedStatement.java:283)
at org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:93)
at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:186)
at org.hibernate.loader.Loader.getResultSet(Loader.java:1787)
at org.hibernate.loader.Loader.doQuery(Loader.java:674)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236)
at org.hibernate.loader.Loader.loadEntity(Loader.java:1860)
at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:48)
at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:42)
at org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:3044)
at org.hibernate.event.def.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:395)
at org.hibernate.event.def.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:375)
at org.hibernate.event.def.DefaultLoadEventListener.load(DefaultLoadEventListener.java:139)
at org.hibernate.event.def.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:195)
at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:103)
at org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:878)
at org.hibernate.impl.SessionImpl.get(SessionImpl.java:815)
at org.hibernate.impl.SessionImpl.get(SessionImpl.java:808)
at org.springframework.orm.hibernate3.HibernateTemplate$1.doInHibernate(HibernateTemplate.java:470)
at org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:372)
at org.springframework.orm.hibernate3.HibernateTemplate.get(HibernateTemplate.java:464)
。。。。。。

请问各位该如何解决?谢谢啦~~

10 个解决方案

#1


this.getHibernateTemplate().find(hql);这个为list 
先要判断结果有没有,再转化为想要的list<>

#2


把hibernate的配置文件中show_sql 改为true ,打印出来hibernate生成的sql
贴出来,再让大家帮你分析下吧。

#3


tomcat可以正常启动,但是当点击了界面中的按钮后就出现这样的错误......以前用mysql做的时候就没有这样的错误,不知道是不是因为sql server2008驱动(我用的是sqljdbc4.jar,但是在用myeclipse的DB browser连接数据库的时候,在添加.jar包以后也不会自动匹配driver class,并且提示driver class不存在......)的问题......
hibernate的配置文件中show_sql 改为true以后控制台给的提示:
2011-1-9 20:09:47 org.apache.catalina.startup.Catalina start
信息: Server startup in 28016 ms
Hibernate: select pic_keywor0_.pic_id as pic1_4_, pic_keywor0_.key_id as key2_4_, pic_keywor0_.analyse as analyse4_ from test.dbo.Pic_Keyword pic_keywor0_ order by pic_keywor0_.pic_id desc
Hibernate: select index0_.cno_id as cno1_0_0_, index0_.pic_id as pic2_0_0_ from test.dbo.Index index0_ where index0_.cno_id=?
2011-1-9 20:15:37 org.apache.catalina.core.StandardWrapperValve invoke
严重: Servlet.service() for servlet default threw exception
com.microsoft.sqlserver.jdbc.SQLServerException: 'Index' 附近有语法错误。如果它要作为表提示的一部分,则必须有 WITH 关键字和圆括号。有关正确的语法,请参阅 SQL Server 联机丛书。
at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:197)
at com.microsoft.sqlserver.jdbc.SQLServerStatement.getNextResult(SQLServerStatement.java:1493)
at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.doExecutePreparedStatement(SQLServerPreparedStatement.java:390)
at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement$PrepStmtExecCmd.doExecute(SQLServerPreparedStatement.java:340)
at com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:4575)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:1400)
at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeCommand(SQLServerStatement.java:179)
at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeStatement(SQLServerStatement.java:154)
at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.executeQuery(SQLServerPreparedStatement.java:283)
at org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:93)
at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:186)
at org.hibernate.loader.Loader.getResultSet(Loader.java:1787)
at org.hibernate.loader.Loader.doQuery(Loader.java:674)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236)
at org.hibernate.loader.Loader.loadEntity(Loader.java:1860)
at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:48)
......

#4


既然你用hql,那怎么还用sql写啊from Pic_Keyword pic_keyword order by pic_keyword.pic_id desc???

把对应的sql代码改成实体类和属性就可以了

#5


“from Pic_Keyword pic_keyword order by pic_keyword.pic_id desc”是标准的hql语句啊......

#6


.....................从from开始写sql就是hql

#7


我这个查询语句应该没问题吧?因为第一步的查询是正确的,只有二次查询(需要传给参数id)的时候才报错,详见hibernate生成的hql语句。

#8


引用 7 楼 dorathyliuyuchen 的回复:
我这个查询语句应该没问题吧?因为第一步的查询是正确的,只有二次查询(需要传给参数id)的时候才报错,详见hibernate生成的hql语句。

ding.........

#9


index是不是你表中有字段的名字是关键字,不允许的。

#10


问题解决了,把数据库中表的名称改了以后就对了,应该是命名冲突的问题,谢谢大家了~~

#1


this.getHibernateTemplate().find(hql);这个为list 
先要判断结果有没有,再转化为想要的list<>

#2


把hibernate的配置文件中show_sql 改为true ,打印出来hibernate生成的sql
贴出来,再让大家帮你分析下吧。

#3


tomcat可以正常启动,但是当点击了界面中的按钮后就出现这样的错误......以前用mysql做的时候就没有这样的错误,不知道是不是因为sql server2008驱动(我用的是sqljdbc4.jar,但是在用myeclipse的DB browser连接数据库的时候,在添加.jar包以后也不会自动匹配driver class,并且提示driver class不存在......)的问题......
hibernate的配置文件中show_sql 改为true以后控制台给的提示:
2011-1-9 20:09:47 org.apache.catalina.startup.Catalina start
信息: Server startup in 28016 ms
Hibernate: select pic_keywor0_.pic_id as pic1_4_, pic_keywor0_.key_id as key2_4_, pic_keywor0_.analyse as analyse4_ from test.dbo.Pic_Keyword pic_keywor0_ order by pic_keywor0_.pic_id desc
Hibernate: select index0_.cno_id as cno1_0_0_, index0_.pic_id as pic2_0_0_ from test.dbo.Index index0_ where index0_.cno_id=?
2011-1-9 20:15:37 org.apache.catalina.core.StandardWrapperValve invoke
严重: Servlet.service() for servlet default threw exception
com.microsoft.sqlserver.jdbc.SQLServerException: 'Index' 附近有语法错误。如果它要作为表提示的一部分,则必须有 WITH 关键字和圆括号。有关正确的语法,请参阅 SQL Server 联机丛书。
at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:197)
at com.microsoft.sqlserver.jdbc.SQLServerStatement.getNextResult(SQLServerStatement.java:1493)
at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.doExecutePreparedStatement(SQLServerPreparedStatement.java:390)
at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement$PrepStmtExecCmd.doExecute(SQLServerPreparedStatement.java:340)
at com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:4575)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:1400)
at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeCommand(SQLServerStatement.java:179)
at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeStatement(SQLServerStatement.java:154)
at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.executeQuery(SQLServerPreparedStatement.java:283)
at org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:93)
at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:186)
at org.hibernate.loader.Loader.getResultSet(Loader.java:1787)
at org.hibernate.loader.Loader.doQuery(Loader.java:674)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236)
at org.hibernate.loader.Loader.loadEntity(Loader.java:1860)
at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:48)
......

#4


既然你用hql,那怎么还用sql写啊from Pic_Keyword pic_keyword order by pic_keyword.pic_id desc???

把对应的sql代码改成实体类和属性就可以了

#5


“from Pic_Keyword pic_keyword order by pic_keyword.pic_id desc”是标准的hql语句啊......

#6


.....................从from开始写sql就是hql

#7


我这个查询语句应该没问题吧?因为第一步的查询是正确的,只有二次查询(需要传给参数id)的时候才报错,详见hibernate生成的hql语句。

#8


引用 7 楼 dorathyliuyuchen 的回复:
我这个查询语句应该没问题吧?因为第一步的查询是正确的,只有二次查询(需要传给参数id)的时候才报错,详见hibernate生成的hql语句。

ding.........

#9


index是不是你表中有字段的名字是关键字,不允许的。

#10


问题解决了,把数据库中表的名称改了以后就对了,应该是命名冲突的问题,谢谢大家了~~