2008-11-21 151 views
4

我有这样的Java代码(JPA):我需要这个错误帮助:java.lang.NoSuchMethodError

String queryString = "SELECT b , sum(v.votedPoints) as votedPoint " + 
         " FROM Bookmarks b " + 
         " LEFT OUTER JOIN Votes v " + 
          " on (v.organizationId = b.organizationId) " + 
         "WHERE b.userId = 101 " + 
         "GROUP BY b.organizationId " + 
         "ORDER BY votedPoint ascending "; 
EntityManager em = getEntityManager(); 
Query query = em.createQuery(queryString); 
query.setFirstResult(start); 
query.setMaxResults(numRecords); 
List results = query.getResultList(); 

我不知道什么是错我的查询,因为它给了我这个错误:

 
java.lang.NoSuchMethodError: org.hibernate.hql.antlr.HqlBaseParser.recover(Lantlr/RecognitionException;Lantlr/collections/impl/BitSet;)V 
     at org.hibernate.hql.antlr.HqlBaseParser.fromJoin(HqlBaseParser.java:1802) 
     at org.hibernate.hql.antlr.HqlBaseParser.fromClause(HqlBaseParser.java:1420) 
     at org.hibernate.hql.antlr.HqlBaseParser.selectFrom(HqlBaseParser.java:1130) 
     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:271) 
     at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:180) 
     at org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:134) 
     at org.hibernate.engine.query.HQLQueryPlan.(HQLQueryPlan.java:101) 
     at org.hibernate.engine.query.HQLQueryPlan.(HQLQueryPlan.java:80) 
     at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:94) 
     at org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:156) 
     at org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:135) 
     at org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1650) 

谢谢。

+0

请使用意见征求意见:)如果你使用回答自己的问题的人感到困惑,因为答案默认的排序顺序是*不*通过时间,但通过投票,人们不能告诉你什么回复至。 – 2009-01-09 16:17:31

回答

2

刺在黑暗中 - 你确定你有一个一致的罐子 - 也许你需要获得随您正在使用Hibernate的分布ANTLR罐子...

1

可能是你有一些双 - 引用"缺失或应在您的HQL中加倍。

here

或者你错过了一些简单的报价所示there

0

我有一致的罐子,因为像这样的

"SELECT b FROM table_name b WHERE b.userId = 102 "

简单的查询工作。我已经验证了所有双引号,并且一切都很好。

我的数据库是:mysql,我用jpa连接到它。我不知道是什么导致了这个问题。也许这种类型的加入,我不知道

0

呃,是不是你的查询试图选择b哪个是表别名,这是不允许的,据我所知。

0

我可能会猜测你的查询出了问题,因为HqlBaseParser找不到的方法叫做recover(RecognitionException, Bitset)。也许这个查询由于某种原因而失败,其他更简单的查询就不会(并且在尝试从该错误中恢复时抛出NoSuchMethod异常)。

java.lang.NoSuchMethodError: org.hibernate.hql.antlr.HqlBaseParser.recover(Lantlr/RecognitionException;Lantlr/collections/impl/BitSet;)V 
1

查询似乎是无效的,除非它是格式化的人为因素。

我想你的意思是这样的:

Select b, ...

是:

Select b.organizationId, ...

2

我发现这个问题: 因为这是一个本机查询,因为这2个表的Java类必须有一些特殊的属性:
在Bookmarks.java类

@OneToMany(mappedBy = "bookmarkId") 
private Collection votesCollection; 
和Votes.java类

@JoinColumn(name = "bookmark_id", referencedColumnName = "bookmark_id") 
@ManyToOne 
[private Bookmarks bookmarkId; 

,我也已经改变了查询工作


tring queryString = "SELECT b, sum(v.votedPoints) " + 
          "FROM Bookmarks b " + 
          "LEFT OUTER JOIN b.votesCollection v " + 
          "WHERE b.userId = 101 " + 
          "GROUP BY b.organizationId " + 
          "ORDER BY sum(v.votedPoints) asc "; 

感谢您的帮助

0

您的查询仍然是错误的。也许它适用于你的驱动/分贝,但它不是标准的SQL。您应该选择b.*b.organizationId

7

你一定有您所使用休眠和ANTLR罐版本的问题。在版本2.7.6之前,恢复方法在ANTLR Parser类中不存在?如果您使用的是早期版本的ANTLR,例如2.7.2,那么您会看到这个问题。

使用Maven可能导致这种情况,在那里你依赖于Hibernate和它的传递依赖,但一些“接近”;例如Struts的;提供不同的早期版本的ANTLR,并且早期版本在您的应用程序中得到解决。

如果您可以提供涉及罐子的版本中,我们将能够帮助更多一些。一旦你解决了jar版本的问题,你应该得到一个更透露的错误信息,它显示了你的HQL表达式有什么问题。