使用可分页的Spring Data JPA自定义存储库

3

我创建了自定义仓库和其中一个方法。我想在查询中添加可分页对象以限制返回的项。

我创建了一个额外的方法,用于仅从所有项中提取所选页面。但问题是,如果我有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参数,以便只获取有限的项目。


我不确定我完全理解你想要什么,你只是想要“限制”返回结果的数量还是想要其他东西? - whatamidoingwithmylife
1个回答

2
您可以在Query上使用setMaxResults()setFirstResult()来限制记录数和返回的第一条记录的偏移量。 setMaxResults()等同于SQL中的LIMIT,而setFirstResult()则相当于OFFSET
Query与spring data的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

这解决了部分问题。但是在执行查询后,我得到的是List<Team>,但我需要返回FE Page<Team>,我该怎么做? - user3364181
返回新的PageImpl(teamList, pageable, total),其中total是所有页面中记录的总数。如果前端不需要此信息,则可以将其设置为任何值。 - Ken Chan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接