Search code examples
jpaannotationspaginationcontainer-managed

How to achieve pagination without writing Query in JPA?


I have a Question object which has List of Comment objects with @OneToMany mapping. The Question object has a fetchComments(int offset, int pageSize) method to fetch comments for a given question.

I want to paginate the comments by fetching a limited amount of them at a time.

If I write a Query object then I can set record offset and maximum records to fetch with Query.setFirstResult(int offset) and Query.setMaxResults(int numberOfResults). But my question is how(if possible) can I achieve the same result without having to write a Query i.e. with simple annotation or property. More clearly, I need to know if there is something like

@OneToMany(cascade = CascadeType.ALL)
@Paginate(offset = x,maxresult = y)//is this kind of annotation available?
private List<Comment> comments;

I have read that @Basic(fetch = FetchType.LAZY) only loads the records needed at runtime, but I won't have control to the number of records fetched there. I'm new to JPA. So please consider if I've missed something really simple.


Solution

  • No, there is no such a functionality in JPA. Also concept itself is bit confusing. With your example offset (and maxresult as well) is compile time constant and that does not serve pagination purpose too well. Also in general JPA annotations in entities define structure, not the context dependent result (for that need there is queries).

    If fetching entities when they are accessed in list is enough and if you are using Hibernate, then closest you can get is extra @LazyCollection:

    @org.hibernate.annotations.LazyCollection(LazyCollectionOption.EXTRA)