2012-05-09 14 views
8

Ich brauche @OrderBy (JPA, Hibernate als Anbieter) verwenden Sammlung für verschachtelte Eigenschaft zu sortieren:Hibernate @OrderBy für verschachtelte Eigenschaften

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

In PkdbParameter.java:

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

In Release .java:

... 
private int ordinal; 
... 

(alle diese Felder haben einfache Getter und Setter versehen)

Leider Fehler Ich erhalte:

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

Was ist mit diesem Code falsch? Wenn es nicht möglich ist, verschachtelte Eigenschaften zu verwenden, gibt es eine andere Möglichkeit, die Eigenschaft ordinal zu bestellen?

Antwort

3

@OrderBy funktioniert nur mit direkten Eigenschaften oder eingebetteten Attributen. So Von Java EE 6 docs

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

wenn die Release ein eingebettetes Attribut ist, könnte dies funktionieren. Andernfalls könnten Sie benannte Abfrage verwenden, wie here vorgeschlagen

0

Sie können die Reihenfolge Aussagen geteilt und auf nicht Sammlung Eigenschaften setzen:

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

und

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

Als Nebeneffekt haben Sie festgelegt Sortierreihenfolge für PkdbParameter.

+1

ich dieses versucht, aber es scheint eine ManyToOne Bestellung wird einfach ignoriert. –

2

können Sie die Anmerkung Hibernate @SortComparator verwenden:

So:

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

Wo CameraNameComparator ist:

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

Das ist die einzige Lösung, die für mich funktioniert –

Verwandte Themen