How to paginate a JPA Query
For all JPA query objects (except for native SQL queries), you would use pagination through the setMaxResults(int) and setFirstResult(int) methods. For instance:
return em.createNamedQuery("yourqueryname", YourEntity.class)
.setMaxResults(noOfRecords)
.setFirstResult(pageIndex * noOfRecords)
.getResultList();
JPA will perform the pagination for you.
Named queries are just predefined and can be cached, while other types are dynamically created.
So the choice is to use JPQL like:
Query query = em.createQuery("SELECT s FROM Submission s WHERE s.code = :code or s.id = :id ORDER BY s.id", Submission.class);
Or CriteriaBuilder api to form a similar query:
CriteriaBuilder qb = em.getCriteriaBuilder();
CriteriaQuery<Submission> cq = qb.createQuery(Submission.class);
Root<Submission> root = cq.from(Submission.class);
cq.where( qb.or(
qb.equal(root.get("code"), qb.parameter(String.class, "code")),
qb.equal(root.get("id"), qb.parameter(Integer.class, "id"))
));
Query query = em.createQuery(cq);
Don't forget to set the parameter values using query.setParameter("id", sf.id) for example.
You can use Pageable
in the repository method in Spring
@Repository
public interface StateRepository extends JpaRepository<State, Serializable> {
@Query("select state from State state where state.stateId.stateCode = ?1")
public State findStateByCode(String code, Pageable pageable);
}
And in the service layer, you can create the Pageable
object:
@Autowire
StateRepository stateRepository;
public State findStateServiceByCode(String code, int page, int size) {
Pageable pageable = new PageRequest(page, size);
Page<Order> statePage = stateRepository.findStateByCode(code, pageable);
return statePage.getContent();
}