Предположим, у меня есть сущность «Сообщение» и сущность «Комментарий», а также отношение «один ко многим»:
@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 это или будет мешать этому.