4

我有这个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)

谢谢。

4

9 回答 9

7

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

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

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

于 2009-01-07T13:17:28.567 回答
2

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

于 2008-11-21T12:00:14.297 回答
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 ";

谢谢您的帮助

于 2008-11-21T15:43:03.957 回答
1

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

我想你的意思是:

Select b, ...

成为:

Select b.organizationId, ...

??

于 2008-11-21T12:18:21.547 回答
1

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

插图在这里

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

于 2008-11-21T12:01:46.433 回答
0

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

于 2008-11-21T19:42:06.097 回答
0

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

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

在工作中。我已经验证了所有双引号,一切都很好。

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

于 2008-11-21T12:09:39.707 回答
0

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

于 2008-11-21T12:16:38.603 回答
0

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

java.lang.NoSuchMethodError: org.hibernate.hql.antlr.HqlBaseParser.recover(Lantlr/RecognitionException;Lantlr/collections/impl/BitSet;)V
于 2008-11-21T12:17:10.677 回答