Java Hibernate@OrderBy用于嵌套属性
我需要使用@OrderBy(JPA,Hibernate作为提供程序)对嵌套属性的集合进行排序:Java Hibernate@OrderBy用于嵌套属性,java,hibernate,jpa,orm,hibernate-mapping,Java,Hibernate,Jpa,Orm,Hibernate Mapping,我需要使用@OrderBy(JPA,Hibernate作为提供程序)对嵌套属性的集合进行排序: @OneToMany(mappedBy = "paramSpec", cascade = CascadeType.ALL) @OrderBy("release.ordinal") private List<PkdbParameter> pkdbParams; 在Release.java中: ... private int ordinal; ... (所有这些字段都提供了简单的gette
@OneToMany(mappedBy = "paramSpec", cascade = CascadeType.ALL)
@OrderBy("release.ordinal")
private List<PkdbParameter> pkdbParams;
在Release.java中:
...
private int ordinal;
...
(所有这些字段都提供了简单的getter和setter)
不幸的是,我得到了一个错误:
原因:org.hibernate.AnnotationException:property from@OrderBy子句未找到:some.package.PkdbParameter.release.ordinal
这个代码怎么了?如果无法使用嵌套属性表示法,是否有其他方法可以为
序号
属性排序?@OrderBy
仅适用于直接属性或嵌入属性。从
点(“.”符号用于指代嵌入属性中的属性
因此,如果
Release
是一个嵌入属性,那么这可能会起作用。否则,您可以按照建议使用命名查询您可以拆分order语句并将其放置在非集合属性上:
@OneToMany(mappedBy = "paramSpec", cascade = CascadeType.ALL)
@OrderBy("release")
private List<PkdbParameter> pkdbParams;
作为一个副作用,您对PkdbParameter有固定的排序顺序。您可以使用Hibernate
@SortComparator
注释:
像这样:
@OneToMany(mappedBy = "paramSpec", cascade = CascadeType.ALL)
@SortComparator(ReleaseComparator.class)
private List<PkdbParameter> pkdbParams;
@OneToMany(mappedBy=“paramSpec”,cascade=CascadeType.ALL)
@SortComparator(ReleaseComparator.class)
私有列表pkdbParams;
其中CameraNameComparator为:
public class ReleaseComparator implements Comparator<PkdbParameter> {
@Override
public int compare(PkdbParameter o1, PkdbParameter o2) {
return o1.getRelease().getOrdinal().compareTo( o2.getRelease().getOrdinal() );
}
}
public类ReleaseComparator实现Comparator{
@凌驾
公共int比较(PkdbParameter o1,PkdbParameter o2){
返回o1.getRelease().getOrdinal().compareTo(o2.getRelease().getOrdinal());
}
}
我尝试了这个方法,但似乎忽略了排序多个选项。这将简单地按pkdbParams1排序。释放
并完全忽略序号
属性,这肯定不是原始海报想要的。这在Hibernate版本上可能是不同的行为吗?在persistence.xml
文件中设置Hibernate.show\u sql=true
,自己看看Hibernate创建了什么样的sql代码。感谢您验证这篇论文。
@OneToMany(mappedBy = "paramSpec", cascade = CascadeType.ALL)
@SortComparator(ReleaseComparator.class)
private List<PkdbParameter> pkdbParams;
public class ReleaseComparator implements Comparator<PkdbParameter> {
@Override
public int compare(PkdbParameter o1, PkdbParameter o2) {
return o1.getRelease().getOrdinal().compareTo( o2.getRelease().getOrdinal() );
}
}