2012-05-09 14 views
8

muszę korzystać @OrderBy (JPA, Hibernate jako dostawcy) do sortowania kolekcji własności zagnieżdżonego:Hibernate @OrderBy dla właściwości zagnieżdżonych

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

W PkdbParameter.java:

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

uwalnianie .java:

... 
private int ordinal; 
... 

(wszystkie z tych dziedzin mają proste pobierające i ustawiające wyposażeniu)

Niestety dostaję błąd:

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

Co jest nie tak z tym kodem? Jeśli nie można użyć zagnieżdżonych właściwości notacja, czy istnieje inny sposób zamawiania dla właściwości ordinal?

Odpowiedz

3

@OrderBy działa tylko z bezpośrednimi właściwościami lub atrybutami osadzonymi. Od Java EE 6 docs

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

Więc jeśli Release jest wbudowany atrybut, to może działać. W przeciwnym wypadku można użyć kwerendy o nazwie jako sugerowane here

0

Można podzielić sprawozdań kolejności i umieścić go na właściwości zbierania non:

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

i

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

jako efekt uboczny, zostały ustalone kolejność sortowania dla PkdbParameter.

+1

Próbowałem ten jeden, ale wydaje zamawiania ManyToOne jest po prostu ignorowana. –

2

można używać hibernacji @SortComparator adnotacji:

tak:

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

Gdzie CameraNameComparator jest:

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

To jedyne rozwiązanie, które działa dla mnie –

Powiązane problemy