2

誰かがHibernateという名前のクエリで私を正しい方向に向けてくれることを願っています。

コレクションアイテムのプロパティに基づいて結果を並べ替えたい。例で最も簡単だと思います。

AとBの2つのクラスがあります

Aには、Bのセットであるプロパティ「Bs」があります。

Bには、整数であるプロパティ「rank」があります。

(すべての)Asをクエリし、A.BsのB.rankの合計で並べ替えます。

何かのようなもの:

select x from A as x order by sum(x.Bs.rank)

これが理にかなっていることを願っています!上記のクエリは、「コレクションを逆参照しようとする違法な試み」というエラーをスローするようになりました。

4

2 に答える 2

1

SQL の場合と同様に、テーブル b へのアクセスを選択に手動で追加する必要があります。SQLでは、次のことができます

select a.key, a.col2, a.col3, ... from a, b
   where a.key = b.foreignKeyFromA
   group by a.key, a.col2, a.col3, ...
   order by sum(b.rank);

Hibernate は B へのこのアクセスを自動的に生成しないため、次のような HQL ステートメントで手動で実装する必要があります。

select new A(a.key, a.col2, a.col3, ...) from A a join B b
   group by a.key, a.col2, a.col3, ...
   order by sum(b.rank)

(A の適切なコンストラクターが必要です。または、単一の値を持つオブジェクトの配列を取得できます。A と B の間の関係は、マッピングで定義する必要があります。おそらく、これは既に当てはまります。)

注: group by 句では、選択したすべての列を指定する必要があります。グループ化が変更されない場合でも (キーは既に一意です)。選択したすべての列を指定しないと、Oracle データベースでエラーが発生します。MySQL はこれを必要としません。これでgroup by a.key十分ですが、主にすべてのデータベースで機能する HQL ステートメントを作成する必要があります。

于 2012-09-06T12:12:10.747 に答える
1

A が複雑または継承されている場合、その ID のみを取得したい場合があります。

select a.id, sum(b.rank)
from A as a join a.Bs as b
group by a.id
order by sum(b.rank)

を使用して A をロードしsession.get(id)ます。

于 2012-09-06T13:00:21.990 に答える