2017-03-02 3 views
0

私のスキーマでは、テーブルCutter,PropertyおよびPropertyValueがあります。部分的なコラム:関連プロパティを使用してHibernate @OneToManyをソートしますか?

Cutter 
    id 

Property 
    id 
    name 
    desc 

PropertyValue 
    property_id 
    cutter_id 
    value 

私のような何かをしたい:

@Entity 
@Table(name = "Cutter") 
public 
class 
Cutter implements Serializable 
{ 
    @OrderBy("property.name asc") 
    @OneToMany(mappedBy = "cutter") protected SortedSet<PropertyValue>  properties; 
} 

をしかし、それは明らかな例外が発生:Unknown column 'properties0_.property.name' in 'order clause'

PropertyValueComparableを実装しましたが、これでは十分ではありません。とにかく、Hibernateは@OrderBy注釈を望んでいました。

+0

は 'name'は' PropertyValue'のプロパティですか? '@OrderBy(" name asc ")' – jorgegm

+0

@jorgegmを使用してください。申し訳ありませんが、それが明確ではない場合、 'name'は' Property'のプロパティです。なぜそう簡単ではないのですか? – Rick

+0

ops、私はそれに気付かなかった。 OrderByのjavadocによると、「プロパティまたはフィールド名は、永続プロパティまたは関連付けられたクラスのフィールドまたはフィールド内の埋め込みクラスの名前に一致する必要があります。」考えられる解決策の1つは 'List 'を使用し、 'SortedSet'を構築するための' @ PostLoad'メソッドを実装することです。 – jorgegm

答えて

1

Comparableを使用し、SortedSetプロパティに@Sort(type = SortType.NATURAL)と注釈を付けて、Hibernateがメモリ内でソートできるようにする必要があります。

+0

私は '@ org.hibernate.annotations.SortNatural'を見つけました。これは、私に必要な振る舞いを与えるようですが、これにどのようなパフォーマンスの影響があるか分かりません。幸運なことに、「カッター」あたりのプロパティはほんの一握りです。ありがとうございました! – Rick

+1

これらのプロパティ値にアクセスする必要のあるいくつかの 'Cutter'インスタンスを照会したことがある場合は、' @ BatchSize'を使用してN + 1選択オーバーヘッドを最小化することもできます。明らかに、データベースにソートを実行させるのは理想的ですが、確かめるためには、そのプロファイルとプロファイルに注目してください。 – Naros

関連する問題