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;
...

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

不幸的是,我遇到了错误:

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 回答
-2

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

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

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

作为副作用,您有固定的 PkdbParameter 排序顺序。

于 2014-05-26T16:10:25.813 回答