0

Hibernate を使用して次の例外が発生します。

JPAQueryException が発生しました: クエリの実行中にエラーが発生しました select f from Flyer as f join f.events as e where e.start > ? および e.start < ? f.popularityTag > 1 group by f order by sqrt((-118.39419-f.venue.lng) * (-118.39419-f.venue.lng)+(34.024353-f.venue.lat)*(34.024353-f.会場.lat)) asc: エラー: 列 "venue2_.lng" は GROUP BY 句に表示されるか、集計関数で使用する必要があります

上記は、クエリの HQL を示しています。その HQL が生成する SQL は次のとおりです。

id345_としてflyer0_.idを選択し、venue77_345_としてflyer0_.venue_idを選択します。flyer0_.id=events1_.flyer_idでイベントevents1_に参加します。および events1_.start1 は、flyer0_.id によってグループ化されます。

テーブルはフライヤー、イベント、会場です。

イベント テーブルは、フライヤーの開始時刻と終了時刻を追跡します...フライヤーは複数の日に繰り返すことができます...したがって、複数のイベントがあります。

各フライヤーには 1 つの会場があり、フライヤーで宣伝されていることが行われます。

私のデータベースに関しては、次の URL で説明されているように、Heroku PostgreSQL Crane を使用しています。PostgreSQL 9.1を使用していると思います:

休止状態に関しては、私が使用している Play Framework 1.2.5 は以下を使用しているようです:

- org.hibernate -> hibernate-core 3.6.10.Final
- org.hibernate -> hibernate-commons-annotations 3.2.0.Final
- org.hibernate -> hibernate-entitymanager 3.6.10.Final
- org.hibernate -> hibernate-validator 4.1.0.Final

私の質問は、その JPAQueryException の原因です。どうすれば修正できますか?

ありがとう!

4

1 に答える 1

1

問題は、Pg 9.1 以下では、集計で使用されていない限り、SELECT に表示される ORDER BY のすべての列をリストする必要があることだと思います。9.2 以降では、PRIMARY KEY が GROUP BY にリストされている場合、他のすべても暗黙的にグループ化されることがわかります。

サブクエリを組み込むことで、クエリを言い換えて問題を回避できるようです。

select f
from Flyer as f
where exists (
  SELECT 1 FROM f.events as e
  where e.start > ? and e.start < ? and f.popularityTag > 1
)
order by sqrt((-118.39419-f.venue.lng) * (-118.39419-f.venue.lng)+(34.024353-f.venue.lat)*(34.024353-f.venue.lat)) asc

私はそれをテストしておらず、HQL をあまり書いていないので、調整する必要があるかもしれませんが、アイデアは引き継がれるはずです。

于 2012-10-14T11:43:15.483 に答える