Как отсортировать таблицу ассоциации в, в спящем режиме?

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

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

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

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

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

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

Спасибо!

8
задан Mike 12 January 2010 в 18:25
поделиться

2 ответа

В соответствии со спецификацией JPA:

Имя свойства или поля должно соответствовать постоянному свойству или полю связанного с ним класса

Это объясняет, почему @OrderBy("фильм". 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 не обеспечивает некоторого пользовательского поведения, я использую инкапсуляцию, чтобы получить свою цель

regards,

.
3
ответ дан 6 December 2019 в 00:07
поделиться

Вы также можете добиться этого при времени запроса, используя предложение по порядку, как показано здесь : http://docs.jboss.org/hibernate/core/3.3/reference/ru/html/queryhql.html#queryhql-ordering

1
ответ дан 6 December 2019 в 00:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: