我创建了自定义存储库和其中的一种方法。我想将可分页对象添加到该查询中,以限制返回的项目。
我创建了其他方法,该方法将仅从所有项目中提取所选页面。但是问题是,如果我有50000个项目,我将需要全部获取它们,然后仅从其中选择页面,这对性能非常不利。
public List<Team> findTeamsForUser(long userId, long statusId, TeamCriteria criteria, Pageable pageable) {
StringBuilder sb = new StringBuilder("select team from Team team join TeamMember teamMember on teamMember.team.id=team.id where
teamMember.user.id=" + userId + " AND teamMember.status.id=" + statusId);
if(criteria!=null) {
if (criteria.getGameId() != null) {
sb.append(" AND team.game.id IN " + criteria.getGameId().getIn().toString().replace("[", "(").replace("]", ")"));
}
}
sb.append(" ORDER BY team.createdDate DESC");
Query query = entityManager.createQuery(sb.toString());
return query.getResultList();
}
我想以某种方式将Pageable参数包含到此查询中,以便仅获得有限的项目。
最佳答案
您可以在setMaxResults()
上使用setFirstResult()
和Query
来限制记录数和第一个返回记录的偏移量。setMaxResults()
等效于LIMIT
,其中setFirstResult()
等效于SQL中的OFFSET
。
将spring数据中的Query
与Pageable
结合起来,代码如下:
Query query = entityManager.createQuery(sql.toString());
query.setMaxResults(pageable.getPageSize());
query.setFirstResult(pageable.getOffset());
假设您每次要返回10条记录。每页的
Pageable
为Pageable page1 = PageRequest.of(0, 10); //Page 1 , offset=0 , limit=10
Pageable page2 = PageRequest.of(10, 10); //Page 2 , offset=10 , limit=10
Pageable page3 = PageRequest.of(20, 10); //Page 3 , offset=20 , limit=10
....
......
Pageable pageN = PageRequest.of((n-1)*10, 10); //Page N , offset=(N-1)*10 , limit=10
关于java - 具有分页功能的Spring Data JPA自定义存储库,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57789833/