Мне нужна помощь с этой ошибкой: java.lang.NoSuchMethodError - PullRequest
4 голосов
/ 21 ноября 2008

У меня есть этот код 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 ]

7 голосов
/ 07 января 2009

У вас определенно есть проблема с версией jibernate и ANTLR jar, которые вы используете. Метод восстановления не присутствовал в классе анализатора ANTLR до версии 2.7.6? Если вы используете более раннюю версию ANTLR, например 2.7.2, вы увидите эту проблему.

Использование maven может вызвать ситуацию такого рода, когда вы зависите от Hibernate и его транзитивных зависимостей, но что-то «ближе»; например Struts; предоставляет другую, более раннюю версию ANTLR, и эта более ранняя версия разрешается в вашем приложении.

Если вы можете предоставить версию задействованных банок, мы могли бы помочь еще немного. Как только вы исправите проблему с версиями jar, вы должны получить более показательное сообщение об ошибке, которое показывает, что не так с вашим выражением HQL.

2 голосов
/ 21 ноября 2008

Stab in the dark - Вы уверены, что у вас есть постоянный набор jar-файлов - возможно, вам нужно получить antlr-jar, который поставляется с дистрибутивом hibernate, который вы используете ...

2 голосов
/ 21 ноября 2008

Я нашел проблему: Поскольку это нативный запрос, классы 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 ";

спасибо за помощь

1 голос
/ 21 ноября 2008

Запрос кажется недействительным, если он не является артефактом форматирования.

Я думаю, вы имели в виду это:

Select b, ...

должно быть:

Select b.organizationId, ...

??

1 голос
/ 21 ноября 2008

Может быть, у вас отсутствуют некоторые двойные кавычки " или их нужно удвоить в HQL.

Иллюстрация здесь .

Или вы пропустите несколько простых цитат, как показано там

0 голосов
/ 21 ноября 2008

Ваш запрос все еще не верен. Может быть, он работает с вашим драйвером / БД, но это не стандартный SQL. Вы должны выбрать b.* или b.organizationId.

0 голосов
/ 21 ноября 2008

Вероятно, я предполагаю, что с вашим запросом что-то не так, потому что метод HqlBaseParser не может найти, называется recover(RecognitionException, Bitset). Возможно, по какой-то причине этот запрос не выполняется, другие более простые запросы не выполняются (и при попытке восстановления после этой ошибки возникает исключение NoSuchMethod).

java.lang.NoSuchMethodError: org.hibernate.hql.antlr.HqlBaseParser.recover(Lantlr/RecognitionException;Lantlr/collections/impl/BitSet;)V
0 голосов
/ 21 ноября 2008

Э-э, ваш запрос не пытается выбрать b, который является псевдонимом таблицы и, насколько я знаю, это не разрешено.

0 голосов
/ 21 ноября 2008

У меня непротиворечивый набор банок, потому что такие простые запросы, как этот

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

работают. Я проверил все двойные кавычки, и все в порядке.

Моя база данных: mysql, и я использую jpa для подключения к ней. Я не знаю, что является причиной проблемы. Может быть, этот тип соединения, я не знаю

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...