2012-05-09 14 views
8

ho bisogno di usare @OrderBy (JPA, Hibernate come provider) per ordinare la raccolta per la proprietà nidificato:Hibernate @OrderBy oggetti nidificati

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

In PkdbParameter.java:

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

Nella Release .java:

... 
private int ordinal; 
... 

(tutti questi campi hanno getter e setter semplici fornite)

Purtroppo che sto ricevendo l'errore:

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

Cosa c'è di sbagliato in questo codice? Se è impossibile utilizzare la notazione delle proprietà annidate, esiste un altro modo di ordinare la proprietà ordinal?

risposta

3

@OrderBy funziona solo con proprietà dirette o attributi incorporati. Da Java EE 6 docs

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

Quindi, se il Release è un attributo incorporato, questo potrebbe funzionare. In caso contrario, è possibile utilizzare query denominata come suggerito here

0

È possibile dividere le dichiarazioni di ordine e posizionarlo sulle proprietà non raccolta:

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

e

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

Come effetto collaterale, è stato fissato ordinare per PkdbParameter.

+1

ho provato questo ma sembra l'ordinazione di un ManyToOne è semplicemente ignorato. –

2

È possibile utilizzare l'Hibernate @SortComparator annotazione:

Ti piace questa:

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

Dove CameraNameComparator è:

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

Questa è l'unica soluzione che funziona per me –

Problemi correlati