2

Criteria API を使用する JPA2 は、PostgreSQL に対して無効な SQL を生成するようです。このコードの場合:

Root<DBObjectAccessCounter> from = query.from(DBObjectAccessCounter.class);
Path<DBObject> object = from.get(DBObjectAccessCounter_.object);
Expression<Long> sum = builder.sumAsLong(from.get(DBObjectAccessCounter_.count));
query.multiselect(object, sum).groupBy(object);

次の例外が発生します。

ERROR: column "dbobject1_.id" must appear in the GROUP BY
clause or be used in an aggregate function

生成される SQL は次のとおりです。

select dbobjectac0_.object_id as col_0_0_,
    sum(dbobjectac0_.count) as col_1_0_, dbobject1_.id as id1001_,
    dbobject1_.name as name1013_,
    dbobject1_.lastChanged as lastChan2_1013_,
    dbobject1_.type_id as type3_1013_
    from DBObjectAccessCounter dbobjectac0_
    inner join DBObject dbobject1_
    on dbobjectac0_.object_id=dbobject1_.id
    group by dbobjectac0_.object_id

明らかに、select ステートメントの最初の項目 (dbobjectac0_.object_id) は、group by 句と一致しません。

簡単な例

次の単純な例でも機能しません。

Root<DBObjectAccessCounter> from = query.from(DBObjectAccessCounter.class);
Path<DBObject> object = from.get(DBObjectAccessCounter_.object);
query.select(object).groupBy(object);

返す

select dbobject1_.id as id924_, dbobject1_.name as name933_,
    dbobject1_.lastChanged as lastChan2_933_,
    dbobject1_.type_id as type3_933_
    from DBObjectAccessCounter dbobjectac0_
    inner join DBObject dbobject1_
    on dbobjectac0_.object_id=dbobject1_.id
    group by dbobjectac0_.object_id

上記と同じエラーが発生します。

タイプではなく ID によるグループ化

エラーメッセージで提案されているIDによるグループ化

Root<DBObjectAccessCounter> from = query.from(DBObjectAccessCounter.class);
Path<DBObject> object = from.get(DBObjectAccessCounter_.object);
Path<Long> objectId = from.get(DBObjectAccessCounter_.object).get(DBObject_.id);
query.select(object).groupBy(objectId);

も同じエラーになります。

これを修正する方法を知っている人はいますか?

4

2 に答える 2

1

PostgreSQL 9.2 以降では、「暗黙的にグループ化された」列、つま​​り主キーを配置した場所を検出する方法が改善されているgroup byため、そのテーブルのすべてのフィールドを SELECT リストで参照できます。以前のバージョンではこれが検出されなかったSELECT id, somefield FROM sometable GROUP BY idため、Column sometable.somefield must appear in the GROUP BY clause. 新しいバージョンでは、Pg はが含まれsomefieldているため暗黙的にグループ化されていることを検出しid、このクエリの実行を許可します。

残念ながら、それで問題が解決するかどうかはわかりません。あなたの問題は、結合条件の反対側のキーでグループ化していることです。その列はそのようにマークされていないため、Pg がそれを PK として認識するとは思えません。

自己完結型のテスト ケースを作成し、Hibernate JIRA に関する問題レポートを提出することをお勧めします。ここにリンクしてください。完全で実行可能なテスト ケースができたら、実際にプレイして確認します。

また、変更したテスト ケースでエラー メッセージがまったく同じままであると確信していますか? 異なる番号のエイリアスなどを参照していませんか?

于 2012-09-16T00:11:46.650 に答える
0

EclipseLink最初の例をとでテストしましたMySql。例外はスローされません。目標を誤解していなければ、結果のクエリは探しているものです。

SELECT t0.id, t0.name, SUM(t1.count) 
FROM dbobject t0, dbobjectaccesscounter t1 
WHERE (t0.id = t1.object_id) GROUP BY t0.id, t0.name
于 2012-09-14T19:10:02.480 に答える