【问题标题】:Spring data jpa custom repository with pageable具有可分页功能的 Spring 数据 jpa 自定义存储库
【发布时间】:2020-01-07 10:22:36
【问题描述】:

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

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

【问题讨论】:

  • 我不确定我是否完全理解你想要什么,你只是想LIMIT返回结果的数量还是你想要别的?

标签: java spring spring-data-jpa


【解决方案1】:

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

setMaxResults() 等价于LIMIT,其中setFirstResult() 等价于 SQL 中的OFFSET

Query 与 spring 数据中的 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,但我需要返回 FE Page,我该怎么做?
  • return new PageImpl(teamList, pageable , total) 其中 total 是所有页面中的记录总数。如果 FE 不需要此信息,您可以简单地将其设置为任何内容
猜你喜欢
  • 2015-10-29
  • 2018-10-06
  • 1970-01-01
  • 2017-11-15
  • 1970-01-01
  • 1970-01-01
  • 2021-01-04
  • 2018-04-02
  • 2015-09-01
相关资源
最近更新 更多