我需要有关此错误的帮助:java.lang.NoSuchMethodError

时间:2008-11-21 11:58:08

标签: java hibernate reflection nosuchmethoderror

我有这个Java代码(JPA):

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)

感谢。

9 个答案:

答案 0 :(得分:7)

您使用的hibernate和ANTLR jar版本肯定存在问题。在版本2.7.6之前,ANTLR Parser类中没有恢复方法?如果您使用的是早期版本的ANTLR,例如2.7.2,那么您将看到此问题。

使用maven会导致这种情况,你依赖于Hibernate及其传递依赖,但是“更接近”;例如Struts的;提供者不同的早期版本的ANTLR以及早期版本在您的应用程序中得到解决。

如果您能提供所涉及的罐子版本,我们可以提供更多帮助。一旦你修复了jar版本的问题,你应该得到一个更具启发性的错误信息,它显示你的HQL表达式有什么问题。

答案 1 :(得分:2)

在黑暗中刺 - 你确定你有一套一致的罐子 - 也许你需要得到你正在使用的hibernate发行版附带的antlr jar ......

答案 2 :(得分: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 ";

感谢您的帮助

答案 3 :(得分:1)

可能是您遗失了一些双引号"或者您的HQL应该加倍。

插图here

或者你错过了一些简单的引用,如图there

所示

答案 4 :(得分:1)

除非是格式化工件,否则查询似乎无效。

我认为你的意思是:

  

Select b, ...

是:

  

Select b.organizationId, ...

...

答案 5 :(得分:0)

我有一套一致的罐子,因为像这样的简单查询

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

正在运作。我已经验证了所有双引号,一切都没问题。

我的数据库是:mysql,我使用jpa连接到它。我不知道造成这个问题的原因。也许这种类型的加入,我不知道

答案 6 :(得分:0)

答案 7 :(得分:0)

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

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

答案 8 :(得分:0)

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