Как я могу выполнять разбиение на страницы с коллекциями @OneToMany

Предположим, у меня есть сущность «Сообщение» и сущность «Комментарий», а также отношение «один ко многим»:

@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! framework использует очень интересную библиотеку поверх JPA: Siena. Siena очень проста в использовании и представляет собой хорошую абстракцию поверх JPA / Hibernate. Но я не могу найти, как выполнить разбиение на страницы с его ассоциациями.

Обновление:

Платформа Play имеет синтаксис запроса, аналогичный Django:

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

где

Post.findAll() 

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

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

Post.comments

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

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

Post.comments

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

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 это или будет мешать этому.

16
задан Visus Zhao 20 October 2010 в 02:09
поделиться