繁体   English   中英

具有可分页的 Spring 数据 jpa 自定义存储库

[英]Spring data jpa custom repository with pageable

我创建了自定义存储库和其中的一种方法。 我想向该查询添加可分页对象以限制返回的项目。

我创建了额外的方法,它只会从所有项目中提取选定的页面。 但问题是,如果我有 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 参数,所以我只能得到有限的项目。

您可以在Query上使用setMaxResults()setFirstResult()来限制记录数和第一条返回记录的偏移量。

setMaxResults()等效于LIMIT ,其中setFirstResult()等效于 SQL 中的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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM