2012-05-09 87 views
8

我需要使用@OrderBy(JPA,Hibernate作为供应商),为嵌套属性分类收集:休眠@OrderBy嵌套性

@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

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

The dot (".") notation is used to refer to an attribute within an embedded attribute

所以如果Release是一个嵌入式的属性,这可能是工作。否则,你可以使用所建议的命名查询here

0

可以分割订单报表,并将其放置在非集合属性:

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

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

作为一个副作用,你有固定PkdbParameter的排序顺序。

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

这是唯一适用于我的解决方案 –