Hibernate @OrderBy用于嵌套属性

时间:2012-05-09 14:32:32

标签: java hibernate jpa orm hibernate-mapping

我需要使用@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属性订购吗?

3 个答案:

答案 0 :(得分:3)

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

  

点(“。”)表示法用于表示嵌入属性

中的属性

因此,如果Release是嵌入属性,则可以使用。否则,您可以使用建议的here

命名查询

答案 1 :(得分:2)

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

答案 2 :(得分:-2)

您可以拆分订单陈述并将其放在非集合属性上:

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

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

作为副作用,您已修复PkdbParameter的排序顺序。