簡體   English   中英

Hibernate @OrderBy用於嵌套屬性

[英]Hibernate @OrderBy for nested properties

我需要使用@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;
...

(所有這些字段都提供簡單的getter和setter)

不幸的是我收到了錯誤:

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

這段代碼出了什么問題? 如果不可能使用嵌套屬性表示法有沒有其他方式來訂購ordinal屬性?

@OrderBy僅適用於直接屬性或嵌入屬性。 來自Java EE 6文檔

點(“。”)表示法用於表示嵌入屬性中的屬性

因此,如果Release是嵌入式屬性,則可以使用。 否則,您可以使用此處建議的命名查詢

您可以使用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() );
    }
}

您可以拆分訂單語句並將其放在非集合屬性上:

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

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

作為副作用,您已經修復了PkdbParameter的排序順序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM