我需要使用@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
属性订购吗?
答案 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的排序顺序。