12

ネストされたプロパティのコレクションをソートするには、@OrderBy (JPA、プロバイダとして Hibernate) を使用する必要があります。

@OneToMany(mappedBy = "paramSpec", cascade = CascadeType.ALL)
@OrderBy("release.ordinal")
private List<PkdbParameter> pkdbParams;

PkdbParameter.java で:

...
@ManyToOne
@JoinColumn(name = "release_id")
private Release release;
...

Release.java で:

...
private int ordinal;
...

(これらのフィールドにはすべて、単純なゲッターとセッターが用意されています)

残念ながら、私はエラーが発生しています:

Caused by: org.hibernate.AnnotationException: property from @OrderBy clause not found: some.package.PkdbParameter.release.ordinal

このコードの何が問題になっていますか? ネストされたプロパティ表記を使用できない場合、プロパティを注文する他の方法はありordinalますか?

4

3 に答える 3

6

Hibernate@SortComparatorアノテーションを使用できます。

このような:

@OneToMany(mappedBy = "paramSpec", cascade = CascadeType.ALL)
@SortComparator(ReleaseComparator.class)
private List<PkdbParameter> pkdbParams;

CameraNameComparator の場所:

public class ReleaseComparator implements Comparator<PkdbParameter> {
    @Override
    public int compare(PkdbParameter o1, PkdbParameter o2) {
        return o1.getRelease().getOrdinal().compareTo( o2.getRelease().getOrdinal() );
    }
}
于 2016-10-27T19:43:52.783 に答える
4

@OrderBy直接プロパティまたは埋め込み属性でのみ機能します。Java EE 6 ドキュメントから

ドット (".") 表記は、埋め込み属性内の属性を参照するために使用されます。

したがって、Releaseが埋め込み属性である場合、これは機能する可能性があります。それ以外の場合は、ここで提案されている名前付きクエリを使用できます

于 2013-03-22T10:36:51.480 に答える