当前位置: 首页 > 知识库问答 >
问题:

Spring数据可分页和LIMIT/OFFSET

谢运良
2023-03-14

我正在考虑将我们传统的jpa/道解决方案迁移到Spring Data。

但是,我们的前端之一是SmartGWT,它们的数据库组件仅使用限制/偏移逐步加载数据,这使得难以使用Pagable。

这会导致问题,因为无法确定限制/偏移量最终是否可以转换为页码。(这可能因用户滚动方式、屏幕大小等而异)。

我查看了切片等,但无法找到在任何地方使用限制/偏移值的方法。

想知道有没有人有什么建议?最理想的情况是,我希望继续使用限制/偏移,但在我的存储库界面中使用它们,而不必像现在一样编写实现代码并手动设置它们(query.setMaxResults等)

编辑:为了澄清问题的原因-smartgwt组件中初始和后续数据获取之间的限制/偏移可能不同。例如,对于listgrid,第一次提取可能将限制设置为89,因为这是屏幕上可见的行数,偏移量为0。不过,下一个请求的偏移量可能为89,并且限制为50,因为这是组件的“datapagesize”值,所以当我向下滚动时,它将获取50。如果我在发布之前滚动到远下,根据设置,它可能取而代之的是第159-209行。基本上,无法保证偏移量是任何值的倍数。很难将偏移量17(限制为5)转换为一页。

共有2个答案

锺离锦
2023-03-14
public class OffsetLimitPageable extends PageRequest {
    private int offset;
    public OffsetLimitPageable(int offset, int limit){
        super(offset,limit);
        this.offset=offset;
    }
    @Override
    public long getOffset(){
        return this.offset;
    }
}

和示例

Page<WashComment> washComments = washCommentRepository.findWashCommentByWashId_CarWashIdOrderByDateDesc(carWash, new OffsetLimitPageable(offsetNumberRepresentation,
                 limitNumberRepresentation > Config.getMaxLimitAmount() ? Config.getMaxLimitAmount() : limitNumberRepresentation));

如果这是你想要的,请告诉我

乐正嘉瑞
2023-03-14

Pagebale实现确实使用限制偏移来创建分页。构造函数中的page值用于在AbstractPageRequestclassgetOffset方法中生成偏移值:

public int getOffset() {
    return this.page * this.size;
}

如果您只想使用限制偏移并从组合中丢弃页面参数,请查看Web支持上的Spring数据留档,特别是关于覆盖默认配置的部分。您可以创建自己的Pagable实现,将限制偏移作为构造函数参数,并实现自己的HandlerMachodArgumentResolver以替换标准的PageRequest解析。快速和肮脏的例子:

可分页实现

public class BetterPageRequest implements Pageable {

    public BetterPageRequest(int limit, int offset){
        this.limit = limit;
        this.offset = offset;
    }

    // Other method implementations

}

HandlerMethodArgumentResolver实现

public class BetterPageableResolver implements HandlerMethodArgumentResolver {

    @Override
    public boolean supportsParameter(MethodParameter parameter){
        return Pageable.class.equals(parameter.getParameterType());
    }

    @Override
    public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer container, NativeWebRequest request, WebDataBinderFactory factory){
        Map<String,String[]> params = request.getParameterMap();
        return new BetterPageRequest(params.get('limit')[0], params.get('offset')[0]);
    }

}
 类似资料:
  • 问题内容: 我正在使用Spring Data JPA,当我用来定义一个 WITHOUT 的查询时,它可以工作: 但是,如果我添加第二个参数,则将无法正常工作,Spring将解析该方法的名称,然后抛出 异常 。这是错误吗? 问题答案: 在Spring论坛上提出了一个类似的问题,指出要应用分页,必须派生第二个子查询。因为子查询引用的是相同的字段,所以您需要确保查询对引用的实体/表使用别名。这意味着您在

  • 我有一个简单的JpaRepository和一个finder,它返回按名为“number”的属性降序排列的记录。“number”属性也是我的实体的@Id。这很好,但是有数千条记录,所以我想返回一个页面而不是列表。 如果我将查找器更改为以下内容,则排序不再起作用。我尝试过使用可分页参数的排序功能,但不起作用。还删除了OrderByNumberDesc,但结果相同。 EDIT-添加控制器方法 以下是我的

  • 好吧,这很烦人,我真的不知道该怎么解决,所以事情是这样的。 获得了一个返回分页数据的应用程序,如下所示: 检索结果需要花费很长时间。 但是,如果我调用like(使用上面安装的相同可分页对象): 并且存储库上有: 而且,结果马上就会出现。 我假设,对于第一种永远需要的情况,Spring首先检索所有数据(不限制行),然后返回一个带有结果数量信息的页面。 不知道是否与注释有关。 我使用的是2.3.0。顺

  • 本文向大家介绍MongoDB 使用Skip和limit分页,包括了MongoDB 使用Skip和limit分页的使用技巧和注意事项,需要的朋友参考一下 使用Skip和limit可以如下做数据分页: Code:   备注:可用于分页,limit是pageSize,skip是第n-1页*pageSize (n-1表示几  第1,2...页)      skip表示跳过  多少条数据,   聚合管道的优

  • 问题内容: 如何使用和在一起? personelRepository.java personelService.java personelController.java 当我运行它时,会出现这样的错误。但是,如果我像findAll(Pageable page)和findAll(Specification filter)一样分别调用findAll()函数,它将起作用。但是我不能一起使用。 问题答案:

  • 我想用Spring Data Mongo实现分页。有很多教程和文档建议使用PagingAndSorting Repository,如下所示: 因此,因为PagingAndSorting Repository提供了用于分页查询的api,我可以像这样使用它: 我的问题是这里的findAll方法实际上是在哪里实现的?我需要自己编写它的实现吗?实现StoryRepo的StoryRepoImpl需要实现这个