@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 这个错误依旧。
疑惑中.....

解决方案 »

  1.   

    这个语言本人不熟,
    Query query = s.createQuery("from User");
    是否可以完善为:
    Query query = s.createQuery("select * from User");
      

  2.   

    Caused by: java.sql.SQLException: 第 1 行: '@P0' 附近有语法错误。
    这里提示一个叫 @PO的东西,而你的sql里面没有类似的信息,可以看得出,错误是由其它地方产生的,而不是sql语句本身的问题,可能是方法调用上?传递参数上?
      

  3.   

    LZ是用Junit测试的吧,试试不用Junit,在main方法中测试一下,看看是否报错……
      

  4.   

    错误我已经贴出来了,
    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); 
      

  5.   

    你是不是方言搞错了啊,看你的sql好像是mssql的方言,如果你是mysql的话就得用mysql的方言
      

  6.   


    9楼的兄弟真是我的救世主啊!以前项目配置文件都是Copy,现在心血来潮自己写.....哎...聪明反被聪明误...
    在网上搜了几天的答案,没有一个答案说是方言问题,可见#9兄弟学习和工作是非常细心的,谢谢了...
    <property name="dialect">org.hibernate.dialect.HSQLDialect</property>
    应改为:
    <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
      

  7.   

    看来楼主的问题已经解决了 恭喜啊
    不过如果遇到这个问题:Caused by: java.sql.SQLException: 第 1 行: '@P0' 附近有语法错误 的话,原因是 sqlserver 分页查询时top后不能用占位符的
      

  8.   


    我是看你select top ?   这个语句觉得可能是方言搞错了,你明显不mysql的分页,mysql应该是limit,自己可以排查下问题 
      

  9.   

    我ibatis+mssql也是这个问题,top后的是个变值,我想当参数传进去的,但是这样mssql预编译sql语句通不过报这个错误,有啥解决方法吗
      

  10.   

    解决了,ibatis里$,#的区别......
    select top  #tops#
    改为
    select top $tops$
    即可