2010-01-12 3 views
8

Учитывая представление таблиц базы данных, в которых через сущность соединяются два объекта, можно ли сортировать другой объект, задающий порядок сортировки каким-либо образом через аннотации?Как сортировать таблицу ассоциации в спящем режиме?

Рассмотрим, грубо говоря, следующие таблицы базы данных:

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

и гибернация объекты, как:

@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; 
} 

Так что я хотел бы иметь возможность по умолчанию сортировка возврата заказа Credits для Актер в порядке убывания к году фильма:

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

Кажется, что один уровень глубокое присоединение довольно просто сортировать с помощью @OrderBy, например @OrderBy ("roleName") ... но как мне перейти еще глубже?

Спасибо!

ответ

3

Согласно спецификации JPA:

Свойство или поле Имя должно соответствовать к тому, что из постоянное свойство или поле ассоциированного класса

Это объясняет, почему @OrderBy («movie.year») не работает, как ожидалось

Если вы не используете запрос HQL, вы должны использовать инкапсуляцию, чтобы получить цель

@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; 
    } 

} 

Иногда, когда Hibernate не обеспечивают некоторое пользовательское поведение, я использую инкапсуляцию, чтобы моя цель

с уважением,

+2

Этим решением имеет серьезный недостаток, заключающийся в том, что подкачки теперь стали невозможной, поскольку результаты сортируются в приложении ярусе вместо уровня DB! –

Смежные вопросы