@Test
public void testHibernate()
{
Configuration config = new Configuration().configure();
Session s = config.buildSessionFactory().openSession();
Query query = s.createQuery("from User");
query.setFirstResult(0); //从user表的第一条记录开始取
query.setMaxResults(2); //user表不只2条记录,我取2条特列
List<User> users = query.list();for (int i=0;i<users.size();i++)
{
System.out.println(users.get(i).getId());;
}
s.close();}后台显示SQL语句: (注意Top后面的问号)
Hibernate:
select
top ? user0_.id as id0_,
user0_.username as username0_,
user0_.password as password0_,
user0_.createTime as createTime0_,
user0_.email as email0_,
user0_.phone as phone0_
from
t_user user0_异常:
org.hibernate.exception.SQLGrammarException: could not execute query
。
Caused by: java.sql.SQLException: 第 1 行: '@P0' 附近有语法错误。我原先以为是数据问题,现在从MYSQL换成Oracle到SQLserver 这个错误依旧。
疑惑中.....
public void testHibernate()
{
Configuration config = new Configuration().configure();
Session s = config.buildSessionFactory().openSession();
Query query = s.createQuery("from User");
query.setFirstResult(0); //从user表的第一条记录开始取
query.setMaxResults(2); //user表不只2条记录,我取2条特列
List<User> users = query.list();for (int i=0;i<users.size();i++)
{
System.out.println(users.get(i).getId());;
}
s.close();}后台显示SQL语句: (注意Top后面的问号)
Hibernate:
select
top ? user0_.id as id0_,
user0_.username as username0_,
user0_.password as password0_,
user0_.createTime as createTime0_,
user0_.email as email0_,
user0_.phone as phone0_
from
t_user user0_异常:
org.hibernate.exception.SQLGrammarException: could not execute query
。
Caused by: java.sql.SQLException: 第 1 行: '@P0' 附近有语法错误。我原先以为是数据问题,现在从MYSQL换成Oracle到SQLserver 这个错误依旧。
疑惑中.....
解决方案 »
- 急求助JAVA访问Oracle的一些异常信息解决
- spring 用了@@Component和@Resource注入 为什么属性还是空的
- 调用webservice问题
- xdjm们帮忙,关于数据库保密!
- 一个JavaMail在websphere的奇怪问题
- 请问如何实现logic:iterate遍历出来的集合放到html:select里?
- tomcat在win2000 pro里能用吗?
- [注意]100分求购5月31日前在SUN社区注册的用户帐号!!!
- 急!!!!! 500分求详细的注解!! 在线等~~~~
- 初学J2EE,不知如何下手.
- 关于工作的选择,大家给点意见。回答都给分。
- servlet中使用RequestDispatcher重定向问题
Query query = s.createQuery("from User");
是否可以完善为:
Query query = s.createQuery("select * from User");
这里提示一个叫 @PO的东西,而你的sql里面没有类似的信息,可以看得出,错误是由其它地方产生的,而不是sql语句本身的问题,可能是方法调用上?传递参数上?
org.hibernate.exception.SQLGrammarException: could not execute query
org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:90)
org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
org.hibernate.loader.Loader.doList(Loader.java:2235)
org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2129)
org.hibernate.loader.Loader.list(Loader.java:2124)
org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:401)
org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:363)
org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:196)
org.hibernate.impl.SessionImpl.list(SessionImpl.java:1149)
org.hibernate.impl.QueryImpl.list(QueryImpl.java:102)com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '2147483647 user0_.id as id0_, user0_.username as username0_, user0_.password as ' at line 1
sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
java.lang.reflect.Constructor.newInstance(Constructor.java:513)
com.mysql.jdbc.Util.handleNewInstance(Util.java:409)
com.mysql.jdbc.Util.getInstance(Util.java:384)
com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1054)
com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3566)
com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3498)
com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1959)
com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2113)
com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2568)
com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2113)
com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:2275)
org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:93)
org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:208)
org.hibernate.loader.Loader.getResultSet(Loader.java:1812)
org.hibernate.loader.Loader.doQuery(Loader.java:697)
org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:259)
org.hibernate.loader.Loader.doList(Loader.java:2232)
org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2129)
org.hibernate.loader.Loader.list(Loader.java:2124)
org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:401)
org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:363)
org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:196)
org.hibernate.impl.SessionImpl.list(SessionImpl.java:1149)
org.hibernate.impl.QueryImpl.list(QueryImpl.java:102)
com.lgp.cms.pager.AbstractPager.searchPaginated(AbstractPager.java:65)
com.lgp.cms.pager.AbstractPager.searchPaginated(AbstractPager.java:107)
com.lgp.cms.pager.AbstractPager.searchPaginated(AbstractPager.java:83)
com.lgp.cms.manager.impl.UserManagerImpl.searchUsers(UserManagerImpl.java:72)
com.lgp.cms.action.UserAction.user_list(UserAction.java:152)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
java.lang.reflect.Method.invoke(Method.java:597)配置文件是没有问题的,因为去掉下面两句能够正常显示列表
query.setFirstResult(0);
query.setMaxResults(2);
9楼的兄弟真是我的救世主啊!以前项目配置文件都是Copy,现在心血来潮自己写.....哎...聪明反被聪明误...
在网上搜了几天的答案,没有一个答案说是方言问题,可见#9兄弟学习和工作是非常细心的,谢谢了...
<property name="dialect">org.hibernate.dialect.HSQLDialect</property>
应改为:
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
不过如果遇到这个问题:Caused by: java.sql.SQLException: 第 1 行: '@P0' 附近有语法错误 的话,原因是 sqlserver 分页查询时top后不能用占位符的
我是看你select top ? 这个语句觉得可能是方言搞错了,你明显不mysql的分页,mysql应该是limit,自己可以排查下问题
select top #tops#
改为
select top $tops$
即可