我需要这个错误的帮助:java.lang.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 在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) at org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:156) 在org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:135) 在org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1650)
谢谢。
您使用的hibernate和ANTLR jar版本肯定存在问题。 在版本2.7.6之前,ANTLR Parser类中没有恢复方法? 如果您使用的是早期版本的ANTLR,例如2.7.2,那么您将看到此问题。
使用maven会导致这种情况,你依赖于Hibernate及其传递依赖,但是“更接近”; 例如Struts; 提供者不同的早期版本的ANTLR以及早期版本在您的应用程序中得到解决。
如果您能提供所涉及的jar子的版本,我们将能够提供更多帮助。 一旦你修复了jar版本的问题,你应该得到一个更具启发性的错误信息,它显示你的HQL表达式有什么问题。
在黑暗中刺 – 你确定你有一套一致的jar子 – 也许你需要得到你正在使用的hibernate发行版附带的antlr jar …
我发现了问题:因为这是一个本机查询,这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 ";
谢谢您的帮助
可能你有一些双引号"
丢失或者你的HQL应该加倍。
插图在这里 。
或者你错过了一些简单的引用,如图所示
除非是格式化工件,否则查询似乎无效。
我想你的意思是:
Select b, ...
成为:
Select b.organizationId, ...
??
我有一套一致的jar子,因为像这样的简单查询
“SELECT b FROM table_name b WHERE b.userId = 102”
在工作中。 我已经validation了所有的双引号,一切都没问题。
我的数据库是:mysql,我用jpa连接到它。 我不知道造成这个问题的原因。 也许这种类型的加入,我不知道
呃,不是你的查询试图选择b这是一个表别名,据我所知,这是不允许的。
我可能猜测你的查询出了问题,因为HqlBaseParser无法查找的方法称为recover(RecognitionException, Bitset)
。 也许这个查询由于某种原因而失败,其他更简单的查询不会(并且在尝试从该错误中恢复时抛出NoSuchMethodexception)。
java.lang.NoSuchMethodError: org.hibernate.hql.antlr.HqlBaseParser.recover(Lantlr/RecognitionException;Lantlr/collections/impl/BitSet;)V
您的查询仍然是错误的。 也许它适用于你的驱动程序/ db,但它不是标准的SQL。 您应该选择b.*
或b.organizationId
。