如何对JPA查询进行分页

我有一个提交表,其中包含IDNameCode等列。 我的要求是根据提到的属性搜索记录并返回一个分页集。

这是我正在寻找的伪代码:

 searchSubmission(searchFilter sf,pageIndex,noOfRecords) { query = 'from submisssion where code=sf.code or id=sf.id order by id start_from (pageIndex*noOfRecords) limit noOfRecords' return result(); } 

似乎有很多选项,如CriteriaBuilderNamedQuery等。在这种情况下哪个是最有效的?

对于所有JPA查询对象(本机SQL查询除外),您将通过setMaxResults(int)和setFirstResult(int)方法使用分页。 例如:

  return em.createNamedQuery("yourqueryname", YourEntity.class) .setMaxResults(noOfRecords) .setFirstResult(pageIndex * noOfRecords)); .getResultList(); 

JPA将为您执行分页。

命名查询只是预定义的,可以缓存,而其他类型是动态创建的。
所以选择使用JPQL如:

 Query query = em.createQuery("SELECT s FROM Submission s WHERE s.code = :code or s.id = :id ORDER BY s.id", Submission.class); 

或者CriteriaBuilder api形成类似的查询:

  CriteriaBuilder qb = em.getCriteriaBuilder(); CriteriaQuery cq = qb.createQuery(Submission.class); Root 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); 

例如,不要忘记使用query.setParameter(“id”,sf.id)设置参数值。

您可以在存储库方法中使用Pageable

 @Repository public interface StateRepository extends JpaRepository { @Query("select state from State state where state.stateId.stateCode = ?1") public State findStateByCode(String code, Pageable pageable); 

}

在服务层中,您可以创建Pageable对象:

 @Autowire StateRepository stateRepository; public State findStateServiceByCode(String code, int page, int size) { Pageable pageable = new PageRequest(page, size); Page statePage = stateRepository.findStateByCode(code, pageable); return statePage.getContent(); } 

正如我在本文中解释的那样,您可以对实体查询和本机SQL使用JPA分页。

要限制基础查询ResultSet大小,JPA Query接口提供setMaxResults方法 。

导航以下页面需要将结果集定位在最后一页结束的位置。 为此,JPA Query接口提供了setFirstResult方法 。

使用JPQL查询分页如下:

list posts = entityManager .createQuery(“select p”+“from Post p”+“order by p.createdOn”)。setFirstResult(10).setMaxResults(10).getResultList();

Criteria API是一样的,因为您需要从CriteriaQuery创建一个Query

 CriteriaBuilder qb = em.getCriteriaBuilder(); CriteriaQuery cq = qb.createQuery(Post.class); Root root = cq.from(Post.class); cq.orderBy(qb.asc(root.get("createdOn"))); List posts = em .createQuery(cq) .setFirstResult(10) .setMaxResults(10) .getResultList();