Hibernate @OrderBy用于嵌套属性

Pio*_*zyk 10 java orm hibernate jpa hibernate-mapping

我需要使用@OrderBy(JPA,Hibernate作为提供者)来为嵌套属性排序集合:

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

在PkdbParameter.java中:

...
@ManyToOne
@JoinColumn(name = "release_id")
private Release release;
...
Run Code Online (Sandbox Code Playgroud)

在Release.java中:

...
private int ordinal;
...
Run Code Online (Sandbox Code Playgroud)

(所有这些字段都提供简单的getter和setter)

不幸的是我收到了错误:

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

这段代码出了什么问题?如果不可能使用嵌套属性表示法有没有其他方法来订购ordinal属性?

Vla*_*cea 11

您可以使用 Hibernate@SortComparator注释:

像这样:

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

其中 CameraNameComparator 是:

public class ReleaseComparator implements Comparator<PkdbParameter> {
    @Override
    public int compare(PkdbParameter o1, PkdbParameter o2) {
        return o1.getRelease().getOrdinal().compareTo( o2.getRelease().getOrdinal() );
    }
}
Run Code Online (Sandbox Code Playgroud)


ane*_*rgy 4

@OrderBy仅适用于直接属性或嵌入属性。来自Java EE 6 文档

点(“.”)表示法用于引用嵌入属性中的属性

因此,如果 是Release嵌入属性,则这可以工作。否则,您可以按照此处的建议使用命名查询