2012-05-09 10 views
8

necesito utilizar @OrderBy (JPA, Hibernate como proveedor) para ordenar la colección de la propiedad anidada:Hibernate @OrderBy de propiedades anidadas

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

En PkdbParameter.java:

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

En la versión .java:

... 
private int ordinal; 
... 

(todos estos campos tienen captadores y definidores proporcionados simples)

Desafortunadamente estoy error al obtener:

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

Qué le pasa a este código? Si no es posible utilizar la anotación de propiedades anidadas, ¿hay alguna otra forma de solicitar la propiedad ordinal?

Respuesta

3

@OrderBy funciona solo con propiedades directas o atributos integrados. De Java EE 6 docs

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

Así que si el Release es un atributo incorporado, esto podría funcionar. De lo contrario podría utilizar consulta con nombre como se sugiere here

0

Puede dividir las cuentas de orden y colocarlo en propiedades no de recogida:

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

y

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

Como efecto secundario, se han fijado orden de clasificación para PkdbParameter

+1

yo probamos este uno pero parece ordenar una ManyToOne es simplemente ignorado. –

2

Puede utilizar la hibernación @SortComparator anotación:

De esta manera:

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

Dónde CameraNameComparator es:

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

Esa es la única solución que funciona para mí –

Cuestiones relacionadas