Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate@OrderBy用于嵌套属性_Java_Hibernate_Jpa_Orm_Hibernate Mapping - Fatal编程技术网

Java Hibernate@OrderBy用于嵌套属性

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

我需要使用@OrderBy(JPA,Hibernate作为提供程序)对嵌套属性的集合进行排序:

@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() );
    }
}