2010-12-08 13 views
8

tenemos las siguientes clases JPA:¿Cómo puedo ordenar dinámicamente una propiedad de colección en JPA?

@Entity 
class Supplier { 
    // ... id property etc. 

    @OneToMany 
    @OrderBy("someProperty") 
    private List<Region> regions; 
} 

Esto funciona bien en el caso normal. Sin embargo, tenemos algunos datos multilingües donde los valores se almacenan en propiedades como nameEn, nameDe, nameZh. La propiedad exacta para usar depende del usuario que haya iniciado sesión. Por ejemplo, un usuario de habla alemana debería ver las regiones como si hubiera sido anotado con @OrderBy("nameDe").

¿Cómo puedo lograrlo?

Soy consciente de que podría ordenar la colección en mi código después de que se haya cargado, pero esto hace que la paginación de los resultados sea bastante difícil.

+2

no puede incrustar en la anotación de que desde las anotaciones se procesan una vez cuando se crea el EntityManagerFactory para su unidad de persistencia. Lo que intenta hacer es similar a crear una consulta dinámica. –

Respuesta

4

Puede ordenarlos en java. Posiblemente en un captador:

List<Region> getRegions(){ 
    sorted = new List<Regions>(regions); 
    Collections.sort(sorted, new RegionComparator(getUserLanguage())); 
    return sorted; 
} 
+0

¿Qué sucede si tiene 1000 artículos en la colección y desea obtener solo los primeros 10 ordenados por alguna propiedad? Hacer esto en dbms sería mucho más eficiente –

+0

@LaurynasTretjakovas Luego, simplemente iteraría sobre los primeros 10 elementos después de la clasificación. No estoy seguro de qué le hace creer que una base de datos sería más eficiente. –

+1

@ b1nary.atr0phy porque la base de datos puede usar un índice para ordenar los elementos y si tienes muchos registros terminas transfiriendo más datos de los que necesitas a través del cable. –

Cuestiones relacionadas