2012-05-09 56 views
8

tôi cần phải sử dụng @OrderBy (JPA, Hibernate là nhà cung cấp) để sắp xếp bộ sưu tập cho tài sản lồng nhau:Hibernate @OrderBy cho thuộc tính lồng nhau

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

Trong PkdbParameter.java:

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

Trong phát hành .java:

... 
private int ordinal; 
... 

(tất cả các trường này có getters và setters đơn giản được cung cấp)

Đáng tiếc là tôi nhận được lỗi:

Caused by: org.hibernate.AnnotationException: property from @OrderBy clause not found: some.package.PkdbParameter.release.ordinal

Có gì sai với mã này? Nếu không thể sử dụng ký hiệu thuộc tính lồng nhau thì có cách nào khác để đặt hàng cho thuộc tính ordinal không?

Trả lời

3

@OrderBy chỉ hoạt động với các thuộc tính trực tiếp hoặc thuộc tính được nhúng. Từ Java EE 6 docs

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

Vì vậy, nếu Release là thuộc tính được nhúng, điều này có thể hoạt động. Nếu không, bạn có thể sử dụng tên truy vấn như đề xuất here

0

Bạn có thể chia những điều khoản về trật tự và đặt nó vào thuộc tính không thu:

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

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

Như một tác dụng phụ, bạn đã cố định thứ tự sắp xếp cho PkdbParameter.

+1

tôi đã cố gắng này nhưng có vẻ như ra lệnh cho một ManyToOne chỉ là bỏ qua. –

2

Bạn có thể sử dụng Hibernate @SortComparator chú thích:

Như thế này:

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

đâu CameraNameComparator là:

public class ReleaseComparator implements Comparator<PkdbParameter> { 
    @Override 
    public int compare(PkdbParameter o1, PkdbParameter o2) { 
     return o1.getRelease().getOrdinal().compareTo(o2.getRelease().getOrdinal()); 
    } 
} 
+0

Đó là giải pháp duy nhất phù hợp với tôi –

Các vấn đề liên quan