最近我开始使用ApacheCMIS,并阅读了官方文档和示例。我没有注意到任何关于分页查询结果的内容。
有一个示例显示了如何列出文件夹项,使用operationContext设置maxItemsPerPage,但operationContext似乎可以在getChilder方法中使用:
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(limit)。这种寻呼方法正确吗?此外,我想检索项目总数,这样我就可以知道如何在显示我的项目的网格中设置最大项目数。有一种方法,但文档中写了一些奇怪的东西,比如有时存储库无法知道最大项目。这就是方法:
results.getTotalNumItems();
我试过这样的东西:
SELECT COUNT(*)...
但这并没有奏效:)
请给我一些建议,如何根据查询结果进行正确的分页?
提前谢谢。
Query返回与getChildren返回的ItemIterable相同的ItemItarable,因此您可以对查询返回的结果集进行分页,就像对getChildren所返回的结果集中进行分页一样。
假设您有一个结果页面,其中显示了页面上的20个项目。考虑一下我在OpenCMIS工作台的Groovy控制台中针对一个名为testN.txt:的文件夹运行的这个片段
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&Apache化学在行动。