首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Apache :分页查询结果

Apache :分页查询结果
EN

Stack Overflow用户
提问于 2014-01-13 20:14:55
回答 1查看 5.5K关注 0票数 1

最近,我开始使用Apache,并阅读了官方文档和示例。我没有注意到有关分页查询结果的任何内容。

有一个示例演示如何列出文件夹项,如何使用operationContext设置operationContext,但似乎可以在getChilder方法中使用operationContext:

代码语言:javascript
复制
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文件夹时,这是可以的。但我的例子是从自定义搜索查询中获取结果。基本办法是:

代码语言:javascript
复制
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。这样做的目的是键入这样的内容:

代码语言:javascript
复制
ItemIterable<QueryResult> results = session.query(queryString, false).skipTo(startIndex).getPage(limit);

我不确定这部分:getPage(极限)。这种分页方法正确吗?此外,我想检索项目的总数,以便我可以知道如何设置最大的项目在网格中,我的项目将显示。有一个方法,但是有些奇怪的东西是在文档中编写的,比如有时候存储库无法意识到最大的项。这是一种方法:

代码语言:javascript
复制
results.getTotalNumItems();

我试过这样的方法:

代码语言:javascript
复制
SELECT COUNT(*)...

但这并没有起作用:)

请给我一些建议,如何根据查询结果进行适当的分页?

提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-01-15 02:11:54

查询返回的ItemIterable与getChildren返回的相同,因此您可以页面查询返回的结果集,就像可以分页getChildren返回的结果集一样。

假设您有一个结果页,其中显示页面上的20个项。考虑下面这个片段,我在OpenCMIS工作台中的Groovy控制台中针对一个文件夹运行了这个片段,其中包含149个名为testN.txt的文件:

代码语言:javascript
复制
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类,这是一个示例web应用程序,它附带了“CMIS & Action”一书。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21100503

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档