2010-01-12 10 views
8

Dada una representación de las tablas de la base de datos donde dos entidades están conectadas a través de una tabla de unión, ¿es posible ordenar la otra entidad especificando el orden de clasificación de alguna manera a través de anotaciones?¿Cómo ordenar a través de una tabla de asociación en hibernación?

considerar, más o menos, las siguientes tablas de la base:

actor (id, name) 
credit (actorId, movieId, roleName) 
movie (id, title, year) 

y de hibernación entidades como:

@Entity 
class Actor { 
    @Id 
    Integer id; 
    @Column 
    String name; 
    @OneToMany 
    @JoinColumn(name = "actorId") 
    List<Credit> credits; 
} 

@Entity 
class Credit { 
    @Column 
    String roleName; 
    @ManyToOne 
    @JoinColumn(name = "movieId") 
    Movie movie; 
} 

@Entity 
class Movie { 
    @Id 
    Integer id; 
    @Column 
    Integer year; 
    @Column 
    String title; 
} 

así que me gustaría ser capaz de tener la orden predeterminado Créditos de retorno para un fin Actor en orden descendente por el año de la película:

actor.getCredits(); // Returns credits in order of Credit.movie.year 

Parece un nivel La unión profunda es bastante fácil de ordenar usando @OrderBy, por ejemplo @OrderBy ("roleName") ... pero, ¿cómo puedo hacer otra combinación más profunda?

Gracias!

Respuesta

3

De acuerdo con la especificación JPA:

La propiedad o campo de nombre debe corresponder a la de una propiedad o campo persistente de la clase asociada

Esto explica por qué @OrderBy ("movie.year") no funciona como se esperaba

A menos que utilice una consulta HQL, se debe utilizar la encapsulación para conseguir su objetivo

@Entity 
public class Actor { 

    private List<Credits> credits = new ArrayList<Credits>(); 

    @OneToMany 
    @JoinColumn(name="ACTOR_ID") 
    public List<Credits> getCredits() { 
     return this.credits; 
    } 

    @Transient 
    public List<Credits> getCreditsOrderedByMovieYear() { 
     Collections.sort(credits, new Comparator<Credits>() { 
      public int compare(Credits o1, Credits o2) { 
       // Integer implements Comparable<T> 
       return o1.getMovie().getYear().compareTo(o2.getMovie().getYear()); 
      } 
     }); 

     return credits; 
    } 

} 

A veces, cuando no lo hace Hibernate proporcionar algún comportamiento personalizado, i el uso de encapsulación para conseguir mi objetivo

respecto,

+2

Esta solución tiene el grave inconveniente de que la paginación se ha convertido en imposible, ya que los resultados se clasifican en el nivel de aplicación en lugar de la capa de base de datos! –

Cuestiones relacionadas