1

OK、これは Hibernate の (別の) バグ/実装されていない機能のように見えます。

HQLSetの句が尊重されるように関連付けをマッピングすることは可能ですか?"order by"

たとえば、 と の 2 つのエンティティがあるPageEntityとしQuestionEntityます。ページにはセットがあります。

次の HQL を機能させるにはどうすればよいですか。

from
    PageEntity p
        left outer join fetch p.questionEntities q
order by
    q.orderIndex

私が望まないもの:

  • Java でソートを使用するには (SQL には「順序付け」があるため、これを行う必要はありません!)。SortedSet、Comparatorsなどは論外
  • を使用してリストとしてマップします<list-index>。これにより、すべての SQL クエリに "order by" が追加されますが、これは望ましくありません
  • 繰り返します<set order-by="orderIndex">が、これはすべてのクエリに適用されます。

デバッグ中、使用されている Set の実装org.hibernate.collection.PersistentSetSet. ラップの実装SetHashSet. Hibernate はLinkedHashSet代わりに a を使用できるほど賢く、私の " order by" HQL 句を尊重できると思います。

4

3 に答える 3

2

Hibernate ではこれを行うことができないと確信しており、List代わりに a を使用することをお勧めします。distinct結合によって生じた重複を削除するには、キーワードを使用できます。結果Listは、他のものと同じくらい良いものになりますSet

順序付けされたオブジェクトがまだ必要な場合Set(サード パーティの API が関係している可能性があります)、独自のオブジェクトを作成し、LinkedHashSetそこにすべてのオブジェクトを移動できます。

List<PageEntity> list = runQuery(...);
return new LinkedHashSet<PageEntity>(list);
于 2011-09-13T16:11:36.487 に答える
0

order by applies to the results of the query. Not to the entities in the collection of questions. I don't think it's a bug: what would it do if one of the returned page entity is already loaded in the session, using another query with another order by clause?

If you want an ordered list of questions, select the questions:

select q from QuestionEntity q inner join fetch q.page p order by q.orderIndex

or

select p, q from PageEntity p
left outer join fetch p.questionEntities q 
order by q.orderIndex

should do the trick.

于 2011-09-13T16:13:28.613 に答える
0

結果を並べ替えたいようですq.orderIndexが、

  • 結果のリストをPageEntityソートしますか?
  • または(私が思うに)QuestionEntity各 PageEntity の一連の s をソートしたいですか?

後者が必要な場合: SetJava の s は順序を保持しません。

編集後: no Hibernate はスマートである必要はありません: コレクションを a に定義すると、Setそれはセットとして扱われます。順序を維持するとリソースが消費され、必要とされないアプリケーションが多数あります。

于 2011-09-13T15:53:50.180 に答える