最近我开始使用Apache CMIS并阅读官方文档和示例。我没有注意到有关分页查询结果的任何信息。
有一个示例显示如何列出文件夹项,使用operationContext设置maxItemsPerPage,但似乎可以在getChilder方法中使用operationContext:
int maxItemsPerPage = 5;
int skipCount = 10;
CmisObject object = session.getObject(session.createObjectId(folderId));
Folder folder = (Folder) object;
OperationContext operationContext = session.createOperationContext();
operationContext.setMaxItemsPerPage(maxItemsPerPage);
ItemIterable<CmisObject> children = folder.getChildren(operationContext);
ItemIterable<CmisObject> page = children.skipTo(skipCount).getPage();
在列出u文件夹时这是可以的。但我的情况是从自定义搜索查询中获取结果。基本方法是:
String myType = "my:documentType";
ObjectType type = session.getTypeDefinition(myType);
PropertyDefinition<?> objectIdPropDef = type.getPropertyDefinitions().get(PropertyIds.OBJECT_ID);
String objectIdQueryName = objectIdPropDef.getQueryName();
String queryString = "SELECT " + objectIdQueryName + " FROM " + type.getQueryName();
ItemIterable<QueryResult> results = session.query(queryString, false);
for (QueryResult qResult : results) {
String objectId = qResult.getPropertyValueByQueryName(objectIdQueryName);
Document doc = (Document) session.getObject(session.createObjectId(objectId));
}
这种方法将检索queryResult中的所有文档,但我想包含startIndex和limit。想法是输入这样的东西:
ItemIterable<QueryResult> results = session.query(queryString, false).skipTo(startIndex).getPage(limit);
我不确定这部分:getPage(限制)。这是正确的分页方法吗?此外,我想检索项目总数,因此我可以知道如何在网格中设置我的项目将显示的最大项目。有一种方法,但在文档中编写了一些奇怪的东西,就像有时存储库无法识别最大项目一样。这就是方法:
results.getTotalNumItems();
我尝试过类似的事情:
SELECT COUNT(*)...
但是没有做到这一点:)
拜托,您能否给我一些建议如何从查询结果中进行正确的分页?
提前致谢。
答案 0 :(得分:6)
Query返回getChildren返回的相同ItemIterable,因此您可以分页查询返回的结果集,就像您可以分页getChildren返回的结果集一样。
假设您有一个结果页面,在页面上显示20个项目。考虑一下我在OpenCMIS Workbench的Groovy控制台中运行的代码片段,该文件夹包含一个名为testN.txt的149个文件的文件夹:
int PAGE_NUM = 1
int PAGE_SIZE = 20
String queryString = "SELECT cmis:name FROM cmis:document where cmis:name like 'test%.txt'"
ItemIterable<QueryResult> results = session.query(queryString, false, operationContext).skipTo(PAGE_NUM * PAGE_SIZE).getPage(PAGE_SIZE)
println "Total items:" + results.getTotalNumItems()
for (QueryResult result : results) {
println result.getPropertyValueByQueryName("cmis:name")
}
println results.getHasMoreItems()
当您使用PAGE_NUM = 1运行它时,您将获得20个结果,最后一个println语句将返回true。另请注意,第一个println将打印149,即与搜索查询匹配的文档总数,但正如您所指出的,并非所有服务器都知道如何返回该文档。
如果你使用PAGE_NUM = 7重新运行它,你将得到9个结果,最后一个println返回false,因为你在列表的末尾。
如果你想看到一个利用OpenCMIS和普通servlet和JSP页面的工作搜索页面,请查看The Blend中的SearchServlet类,这是一本CMIS&amp;书中附带的示例Web应用程序。 Apache Chemistry in Action。