Java 如何设置数据提供者将从后端获取的元素数量?
我想将一些数据从网格延迟加载到我的Vaadin视图中。网格行有时非常大,所以我想将一次加载的行数限制为2 我尝试使用Java 如何设置数据提供者将从后端获取的元素数量?,java,vaadin,vaadin14,Java,Vaadin,Vaadin14,我想将一些数据从网格延迟加载到我的Vaadin视图中。网格行有时非常大,所以我想将一次加载的行数限制为2 我尝试使用DataProvider.fromCallbacks()来实现这一点。不幸的是,我没有得到我想要的结果,我对传递到方法中的两个函数有点困惑 就我的理解而言,传递的第一个函数描述了如何获取项目,第二个函数告诉数据提供者可以获取的项目的最大可能数量 fromCallbacks(CallbackDataProvider.FetchCallback fetchCallback,Callba
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问题被合并:更准确地说,查询限制取决于两个主要条件:
- 网格上的页面大小设置(如您已经找到的)
- 以及-如果您使用的是数据提供程序-数据提供程序大小
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)自动调整
- 由于网格可能会根据我刚才解释的内容更改您的查询限制,如果您刷新数据(例如,因为您在数据提供程序上应用了过滤),您的限制将不再是网格页面大小,除非您在刷新数据之前再次明确设置,例如:
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
我发现这种组合根本没有被记录在案。在SQL中,
LIMIT
将获取限制为指定数量的行,因此我猜您可以在该代码中设置的限制是SQLLIMIT
。您是否尝试设置它,而不是获得明显未知和/或未设置的金额?我的意思是代替int limit=query.getLimit()代码>您可以执行int limit=100
;,例如
grid.setPageSize(GRID_PAGE_SIZE);
grid.getDataProvider().refreshAll();