Java 如何设置数据提供者将从后端获取的元素数量?

Java 如何设置数据提供者将从后端获取的元素数量?,java,vaadin,vaadin14,Java,Vaadin,Vaadin14,我想将一些数据从网格延迟加载到我的Vaadin视图中。网格行有时非常大,所以我想将一次加载的行数限制为2 我尝试使用DataProvider.fromCallbacks()来实现这一点。不幸的是,我没有得到我想要的结果,我对传递到方法中的两个函数有点困惑 就我的理解而言,传递的第一个函数描述了如何获取项目,第二个函数告诉数据提供者可以获取的项目的最大可能数量 fromCallbacks(CallbackDataProvider.FetchCallback fetchCallback,Callba

我想将一些数据从网格延迟加载到我的Vaadin视图中。网格行有时非常大,所以我想将一次加载的行数限制为2

我尝试使用
DataProvider.fromCallbacks()
来实现这一点。不幸的是,我没有得到我想要的结果,我对传递到方法中的两个函数有点困惑

就我的理解而言,传递的第一个函数描述了如何获取项目,第二个函数告诉数据提供者可以获取的项目的最大可能数量

fromCallbacks(CallbackDataProvider.FetchCallback fetchCallback,CallbackDataProvider.CountCallback countCallback)创建一个新的数据提供程序,该数据提供程序将回调用于 从任何备份存储中提取和计数项目

我尝试了以下方法,但它总是导致获取大量项目。(列表中的17项导致17项提取,列表中的120项导致50批)

我必须调用查询对象的
getOffset()
getLimit()
,否则会引发异常。如果我理解正确,那么限制告诉我应该获取多少项(在我的情况下目标是2),但是对象是不可变的,所以我不能更改这个值()

tl;dr我如何告诉数据提供者一次只能获取我的网格中的2项

编辑:我发现与我的问题(,)相关的github问题


编辑2:合并了一个github问题,因此更清楚getLimit()方法的工作原理:

我找到了解决方案

query.getLimit()
方法取决于组件(因此网格)的页面大小

引述:

网格()

创建一个页面大小为50的新实例

我的网格是这样初始化的:
grid a=new grid()导致页面大小为50<在这种情况下,code>query.getLimit()
将返回50

网格(整型页面大小)

创建具有指定页面大小的新实例

像这样初始化网格:
grid a=新网格(5)<在这种情况下,code>query.getLimit()
现在将返回5,而
DataProvider
将只获取接下来的5个元素


编辑:一个关于此SO问题的github问题被合并:

更准确地说,查询限制取决于两个主要条件:

  • 网格上的页面大小设置(如您已经找到的)
  • 以及-如果您使用的是数据提供程序-数据提供程序大小
和2个其他次要标准/行为:

Size Of Data: 219
Offset: 0
Limit: 50

Size Of Data: 219
Offset: 50
Limit: 50

Size Of Data: 219
Offset: 100
Limit: 50

Size Of Data: 219
Offset: 150
Limit: 50

Size Of Data: 219
Offset: 200
Limit: 19
  • 在UI中一次可以显示多少个元素。如果您的网格一次显示的页面大小超过设置的页面大小,那么查询限制将根据数据提供程序大小和我猜的默认页面大小(50)自动调整

  • 由于网格可能会根据我刚才解释的内容更改您的查询限制,如果您刷新数据(例如,因为您在数据提供程序上应用了过滤),您的限制将不再是网格页面大小,除非您在刷新数据之前再次明确设置,例如:

因此,假设您的数据提供程序返回34个结果,您将页面大小设置为5,并且您的UI中显示的结果数量不限,您将有以下行为:

Size Of Data: 219
Offset: 0
Limit: 50

Size Of Data: 219
Offset: 50
Limit: 50

Size Of Data: 219
Offset: 100
Limit: 50

Size Of Data: 219
Offset: 150
Limit: 50

Size Of Data: 219
Offset: 200
Limit: 19
  • 获取前5个(页面大小设置)元素
  • 发现可以在UI上显示更多元素,因此在数据提供程序上触发第二次获取
  • 从偏移量5提取到限制值34

  • 我发现这种组合根本没有被记录在案。

    在SQL中,
    LIMIT
    将获取限制为指定数量的行,因此我猜您可以在该代码中设置的限制是SQL
    LIMIT
    。您是否尝试设置它,而不是获得明显未知和/或未设置的金额?我的意思是代替
    int limit=query.getLimit()您可以执行
    int limit=100
    ;,例如
    grid.setPageSize(GRID_PAGE_SIZE);
    grid.getDataProvider().refreshAll();