【问题标题】:I need help with this error: java.lang.NoSuchMethodError我需要有关此错误的帮助:java.lang.NoSuchMethodError
【发布时间】:2010-09-23 10:33:58
【问题描述】:

我有这个 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 在 org.hibernate.hql.antlr.HqlBaseParser.fromJoin(HqlBaseParser.java:1802) 在 org.hibernate.hql.antlr.HqlBaseParser.fromClause(HqlBaseParser.java:1420) 在 org.hibernate.hql.antlr.HqlBaseParser.selectFrom(HqlBaseParser.java:1130) 在 org.hibernate.hql.antlr.HqlBaseParser.queryRule(HqlBaseParser.java:702) 在 org.hibernate.hql.antlr.HqlBaseParser.selectStatement(HqlBaseParser.java:296) 在 org.hibernate.hql.antlr.HqlBaseParser.statement(HqlBaseParser.java:159) 在 org.hibernate.hql.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:271) 在 org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:180) 在 org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:134) 在 org.hibernate.engine.query.HQLQueryPlan.(HQLQueryPlan.java:101) 在 org.hibernate.engine.query.HQLQueryPlan.(HQLQueryPlan.java:80) 在 org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:94) 在 org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:156) 在 org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:135) 在 org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1650)

谢谢。

【问题讨论】:

  • 请使用 cmets 进行评论 :) 如果您使用自己问题的答案,人们会感到困惑,因为答案的默认排序顺序是不是按时间排序,而是按投票排序,并且人们不知道你在回复什么。

标签: java hibernate reflection nosuchmethoderror


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    可能是您缺少一些双引号 " 或者应该在您的 HQL 中加倍。

    插图here

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

    【讨论】:

      【解决方案3】:

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

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

      正在工作。我已经验证了所有双引号,一切正常。

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

            【解决方案6】:

            查询似乎无效,除非它是格式化的产物。

            我认为你的意思是:

            Select b, ...

            成为:

            Select b.organizationId, ...

            ??

            【讨论】:

              【解决方案7】:

              我发现了问题: 因为这是本机查询,所以这 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 ";
              

              感谢帮助

              【讨论】:

                【解决方案8】:

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

                【讨论】:

                  【解决方案9】:

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

                  使用 maven 可能会导致这种情况,在这种情况下,您依赖 Hibernate 及其传递依赖项,但“更接近”;例如支柱;提供不同的早期版本的 ANTLR,并且该早期版本在您的应用程序中得到解决。

                  如果您可以提供所涉及的 jar 版本,我们将能够提供更多帮助。一旦您解决了 jar 版本的问题,您应该会收到一条更具启发性的错误消息,其中显示您的 HQL 表达式有什么问题。

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2021-09-05
                    • 1970-01-01
                    • 2023-03-08
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2010-12-13
                    • 2017-08-02
                    相关资源
                    最近更新 更多