弹簧数据Pageable和LIMIT/OFFSET



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

然而,我们的前端之一是SmartGWT,它们的数据绑定组件仅使用限制/偏移量逐步加载数据,因此很难使用Pageable。

这会导致问题,因为无法确定限制/偏移是否可以转换为页码。(根据用户的滚动方式、屏幕大小等,可能会有所不同)

我看了Slice等,但没能找到在任何地方使用极限/偏移值的方法。

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

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

Pagebale实现使用limitoffset创建分页。构造函数中的page值用于生成AbstractPageRequestgetOffset方法中的偏移值:

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

如果您只想使用limitoffset并从混合中丢弃page参数,请查看有关web支持的Spring Data文档,特别是关于覆盖默认配置的部分。您可以创建自己的Pageable实现,该实现将limitoffset作为构造函数参数,并实现自己的HandlerMethodArgumentResolver来代替标准的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]);
}
}
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));

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

最新更新