Как я могу сделать пейджинг с коллекциями @OneToMany - PullRequest
15 голосов
/ 19 октября 2010

Предположим, у меня есть сущность Post и сущность Comment, а также отношение один ко многим:

@Entity class Post {
    ...
    @OneToMany
    List<Comment> comments;
    ...
}

Как мне добиться пейджинга следующим образом:

Post post = //Find the post.
return post.getComments().fetch(100, 10); // Find the 11th page (page size 10);

Возможно лиэмулировать динамический пейджинг с коллекциями @OneToMany поверх JPA, или мы должны полностью переписать механизм ассоциации JPA?(например, создать тип коллекции PersistentList, который мог бы управлять поиском, сортировкой и поиском).

PS: я недавно нашел Play!Фреймворк использует очень интересную библиотеку поверх JPA: Сиена.Сиена очень проста в использовании и является хорошей абстракцией поверх JPA / Hibernate.Но я не могу найти, как сделать пейджинг с его ассоциациями.

Обновление:

Платформа воспроизведения имеет синтаксис запроса, подобный Django:

Post.findAll().from(100).fetch(10);  // paging

, где

Post.findAll() 

вернет объект JPAQuery, настроенный тип запроса в Play.

Но со связанными коллекциями, например:

Post.comments

просто вернет List, который нене поддерживает разбиение на страницы или другие запросы.

Мне было интересно, как его расширить, чтобы

Post.comments

также возвращал объект JPAQuery или аналогичный, тогда вы можете выполнить запрос по запросу"collection:

Post.comments.from(100).fetch(10);

или вставьте новый комментарий, фактически не извлекая ни одного комментария:

Post.comments.add(new Comment(...));

По моей первой мысли мы могли создать подкласс List, а затем Post.класс станет:

@Entity class Post {
    ...
    @OneToMany
    QueryList<Comment> comments;
    ...
}

, и QueryList будет иметь методы fetch (), from (), которые являются косвенными для JPAQuery.

Но я не знаю, распознает ли это Hibernate / JPA,или мешать ему.

Ответы [ 2 ]

7 голосов
/ 19 октября 2010

Возможно ли эмулировать динамическое разбиение на страницы с коллекциями @OneToMany поверх JPA (...)

Не поддерживается. Стандартный подход заключается в использовании запроса JPQL для получения комментариев к данному сообщению и использования Query#setFirstResult(int) и Query#setMaxResults(int).

По моей первой мысли, мы могли бы создать подкласс List, (...). Но я не знаю, признает ли Hibernate / JPA это или мешает этому.

Очевидно, что без тяжелого патча радикально изменить поведение по умолчанию не удастся.

3 голосов
/ 22 января 2011

Я думаю, что «правильный» путь может быть больше похож на:

@Entity
class Post {
    ...

    public GenericModel.JPAQuery getComments() {
        return Comment.find("post_id = ?", post_id);
    }
}

, а затем использовать один из fetch методов в JPAQuery:

// fetch first page of results, 25 results per page
post.getComments().fetch(1,25);
...