2009-06-24 4 views
6

Ho una classe dire: "ClassA", che ha una collezione di "ClassB"Hibernate @OrderBy con classe di riferimento

@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY) 
@JoinColumn(name = "COLUMN_NAME")  
private List<ClassB> lotsOfClasses; 

"ClassB" ha una classe mappata "ClassC" utilizzando semplici annotazioni di mappatura vecchi:

public class ClassB { 
... 
    @ManyToOne 
    @JoinColumn(name="AD_POINT_ID") 
    private ClassC classC; 
... 
} 

Come faccio ad aggiungere un'annotazione @OrderBy alla collezione di ClassA a ClassB, in modo che la raccolta è ordinata dal "nome" di proprietà di ClassC

Come così:

@OrderBy(clause="classC.name asc") 

Tutto ciò che ottengo sono eccezioni Oracle che dicono che classC è sconosciuto.

Qualsiasi aiuto qui sarebbe fantastico, dato che mi disturba molto al momento.

P.S. Dovrei anche menzionare che usando l'annotazione OrderBy sulla collezione in questo modo: @OrderBy (clausola = "classC asc") (cioè senza il .name su classC) Ottengo un'istruzione SQL valida, che utilizza la colonna ID (la chiave primaria) di classC su cui ordinare.

Cheers, Segna

+0

Come suggerito da Jiří Vypědřík è possibile implementare l'interfaccia java.util.Comparator. Nel metodo di confronto implementato è possibile implementare la logica per fare riferimento all'oggetto Hibernate Mapped senza problemi e restituire il valore int di conseguenza. Tuttavia, questo non utilizzerà l'ordinamento sul DB Oracle ma l'ordinamento in-memory (JVM). – prageeth

risposta

7

Purtroppo è impossibile fare quello che vuoi. Ho risposto a una domanda simile here.

@OrderBy supporta solo diretta proprietà degli elementi della raccolta.

-1

So solo NHibernate (versione .NET), ma credo che dovrebbe funzionare simile:

@OrderBy(clause = "name asc") 

Oppure si può provare questo:

@OrderBy("name") 
+0

Ma quella sarebbe la proprietà 'name' di ClassB, ho bisogno della proprietà name di ClassC – Mark

1

Ciò è possibile se si utilizza JPA. Vedi questo article.

Poi basta aggiungere @OrderBy("name") alla proprietà raccolta

3

uso @Sort con comparatore personalizzato invece