为什么我用List result = _dao.find("SELECT COUNT(*) AS count from DrawingnoMap A");不会报错,
而当我写成 List result = _dao.find("SELECT COUNT(1) AS count from DrawingnoMap A");就会报下面的异常:
Exception in thread "Thread-6" java.lang.NoSuchMethodError: org.hibernate.hql.antlr.HqlBaseParser.recover(Lantlr/RecognitionException;Lantlr/collections/impl/BitSet;)V at org.hibernate.hql.antlr.HqlBaseParser.aggregate(HqlBaseParser.java:4421) at org.hibernate.hql.antlr.HqlBaseParser.identPrimary(HqlBaseParser.java:4052) at org.hibernate.hql.antlr.HqlBaseParser.primaryExpression(HqlBaseParser.java:861) at org.hibernate.hql.antlr.HqlBaseParser.atom(HqlBaseParser.java:3438) at org.hibernate.hql.antlr.HqlBaseParser.unaryExpression(HqlBaseParser.java:3216)17:18:07,531 ERROR PARSER[reportError]:33 - line 1:14: unexpected token: 1 at org.hibernate.hql.antlr.HqlBaseParser.multiplyExpression(HqlBaseParser.java:3098) at org.hibernate.hql.antlr.HqlBaseParser.additiveExpression(HqlBaseParser.java:2818) at org.hibernate.hql.antlr.HqlBaseParser.concatenation(HqlBaseParser.java:570) at org.hibernate.hql.antlr.HqlBaseParser.relationalExpression(HqlBaseParser.java:2586) at org.hibernate.hql.antlr.HqlBaseParser.equalityExpression(HqlBaseParser.java:2449) at org.hibernate.hql.antlr.HqlBaseParser.negatedExpression(HqlBaseParser.java:2413) at org.hibernate.hql.antlr.HqlBaseParser.logicalAndExpression(HqlBaseParser.java:2331) at org.hibernate.hql.antlr.HqlBaseParser.logicalOrExpression(HqlBaseParser.java:2296) at org.hibernate.hql.antlr.HqlBaseParser.expression(HqlBaseParser.java:2082) at org.hibernate.hql.antlr.HqlBaseParser.aliasedExpression(HqlBaseParser.java:2249) at org.hibernate.hql.antlr.HqlBaseParser.selectedPropertiesList(HqlBaseParser.java:1455) at org.hibernate.hql.antlr.HqlBaseParser.selectClause(HqlBaseParser.java:1365) at org.hibernate.hql.antlr.HqlBaseParser.selectFrom(HqlBaseParser.java:1106) at org.hibernate.hql.antlr.HqlBaseParser.queryRule(HqlBaseParser.java:702) at org.hibernate.hql.antlr.HqlBaseParser.selectStatement(HqlBaseParser.java:296) at org.hibernate.hql.antlr.HqlBaseParser.statement(HqlBaseParser.java:159) at org.hibernate.hql.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:248) at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:157) at org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:111) at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:77) at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:56) at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:72) at org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:133) at org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:112) at org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1623) at org.springframework.orm.hibernate3.HibernateTemplate$29.doInHibernate(HibernateTemplate.java:832) at org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:362) at org.springframework.orm.hibernate3.HibernateTemplate.find(HibernateTemplate.java:830) at org.springframework.orm.hibernate3.HibernateTemplate.find(HibernateTemplate.java:822) at org.ejs.dao.support.GenericDaoSupport.find(Unknown Source) at com.application.dao.hibernate.HibernateDrawingnoMapDAO.findByDrawingnoCode(HibernateDrawingnoMapDAO.java:34) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:585) at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:280) at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:187) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:154) at org.springframework.orm.hibernate3.HibernateInterceptor.invoke(HibernateInterceptor.java:104) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:176) at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:210) at $Proxy118.findByDrawingnoCode(Unknown Source) at com.application.service.pojo.POJODrawingnoMapService.findByDrawingnoCode(POJODrawingnoMapService.java:80) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:585) at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:280) at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:187) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:154) at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:107) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:176) at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:210) at $Proxy119.findByDrawingnoCode(Unknown Source) at com.application.swing.business.DrawingnoMapPlugin.doRefresh(DrawingnoMapPlugin.java:304) at com.application.swing.business.DrawingnoMapPlugin.doStart(DrawingnoMapPlugin.java:298) at com.application.swing.MainFrame$1.run(MainFrame.java:176) at java.lang.Thread.run(Thread.java:595)
我很纳闷,难道是hibernate 不支持count(1)???

解决方案 »

  1.   

    应该是hibernate 不支持这个语法,报的是解析错误,而不是ora错误,这个写法在oracle中是没有问题的
      

  2.   

    hibernate这东西看来不怎么好啊.呵呵!
      

  3.   

    楼主用的是MS的还是ORACLE的驱动,两种驱动支持的SQL语句是不一样的
      

  4.   

    我用的是oracle的驱动。但是我昨天在家里测试的时候又出现了一个很奇怪的问题。
    当我用List result = _dao.find("SELECT COUNT(1) AS count from DrawingnoMap A");时,
    得到的结果跟List result = _dao.find("SELECT A from DrawingnoMap A"); 是一样的。
    而当我写成 List result = _dao.find("SELECT COUNT(*) AS count from DrawingnoMap A");时,得到结果就是数据的记录条数
      

  5.   

    hibernate本身就会去解析sql语法,经楼主测试只支持count(*)事实上,count(*)和count(1)比较已经没有意义了,因为hibernate的解析过程更花时间