Как перебрать ассоциативную таблицу в спящем режиме? - PullRequest
8 голосов
/ 12 января 2010

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

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

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") ... но как мне перейти к еще одному объединению глубже?

Спасибо!

Ответы [ 2 ]

3 голосов
/ 13 января 2010

Согласно спецификации 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 не обеспечивает какое-либо пользовательское поведение, я использую инкапсуляцию, чтобы получить свою цель

С уважением,

1 голос
/ 12 января 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...