3

我尝试在 Spring Boot 应用程序中执行以下操作:创建本机查询并将其分页,以便它可以从 @RestController 返回给定数量的元素的页面。

这是我的代码片段,其中 em 是 @PersistanceContext EntityManager,存储库方法如下,知道 queryString 是本机查询:

Query searchQuery = em.createNativeQuery(this.queryString, MyEntity.class);
List<MyEntity> resultsList = searchQuery.getResultList();
return new PageImpl<>(resultsList, PageRequest.of(index,size), resultsList.size());

我的问题是返回的页面有完整查询结果的内容,而不是PageRequest.of中size参数的内容。

有没有人遇到过同样的问题,可以举一个关于如何对 nativeQuery 进行分页的工作示例吗?

谢谢你的帮助

4

3 回答 3

2

您正在将 Spring Data JPA (Pageable) 与 JPA EntityManager 混合。你不能那样做。如果您已经在使用本机查询,那么只需将分页放入查询中。您可以使用数据库支持的内容,例如标准:

SELECT [a_bunch_of_columns] 
  FROM dbo.[some_table]
  ORDER BY [some_column_or_columns] 
  OFFSET @PageSize * (@PageNumber - 1) ROWS
  FETCH NEXT @PageSize ROWS ONLY;
于 2019-12-12T08:15:52.160 回答
2

这是将本机查询与分页一起使用的示例:

@Query("SELECT c FROM Customer As c INNER JOIN Offer as f  on f.id=c.specialOffer.id  inner join User As u on u.id=f.user.id where u.id=?1 And c.status=?2")  
Page<Customer> getAllCustomerToShop(Integer shopId,String status,Pageable pageable)

然后您可以将其称为:

getAllCustomerToShop(shopId,"status",PageRequest.of(index, PAGE_SIZE));
于 2019-12-11T21:38:13.480 回答
1

修改你的代码如下

Query searchQuery = em.createNativeQuery(this.queryString, MyEntity.class)
                    .setFirstResult(pageable.getPageNumber() * pageable.getPageSize())
                    .setMaxResults(pageable.getPageSize());
于 2019-12-12T08:05:47.737 回答