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 パーサー クラスに回復メソッドは存在しませんでしたか? 2.7.2 などの以前のバージョンの ANTLR を使用している場合、この問題が発生します。

Maven を使用すると、Hibernate とその推移的な依存関係に依存するこの種の状況が発生する可能性がありますが、「より近い」ものです。例: Struts; 別の以前のバージョンの ANTLR を提供し、その以前のバージョンがアプリケーションで解決されます。

関連する jar のバージョンを提供していただければ、さらに多くのことをお手伝いできます。jar バージョンの問題を修正すると、HQL 式の問題点を示す、より明確なエラー メッセージが表示されるはずです。

于 2009-01-07T13:17:28.567 に答える
2

Stab in the dark - 一貫した一連の jar があると確信していますか? おそらく、使用している休止状態ディストリビューションに付属している antlr jar を取得する必要があります...

于 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

あなたの質問はまだ間違っています。たぶんそれはあなたのdriver/dbで動作しますが、それは標準のSQLではありません。b.*またはを選択する必要がありますb.organizationId

于 2008-11-21T19:42:06.097 に答える
0

このような単純なクエリがあるため、一貫したjarのセットがあります

"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 に答える