2013-09-24 49 views
1

我想基于jcr API为CQ创建一个页面。我想查询包含属性中特定字符串的页面。JCR SQL2查询显然没有提供任何结果

查询本身(JCR-SQL2)如下(我测试了它的CQ Web界面上,它提供的结果):

SELECT 
    * 
FROM 
    [nt:base] AS s 
WHERE 
    ISDESCENDANTNODE([/content]) 
AND 
    s.[sling:resourceType] = 'some/path/to/destination' 

这是我尝试在JSP页面:

String stmt = "SELECT * FROM [nt:base] AS s WHERE ISDESCENDANTNODE([/content]) AND s.[cq:template] = 'some/path/to/destination'"; 
    Query query = currentNode.getSession().getWorkspace().getQueryManager().createQuery(stmt, Query.JCR_SQL2); 
    QueryResult results = query.execute(); 
    if (results.getNodes() != null && results.getNodes().hasNext()) { 
     NodeIterator it = results.getNodes(); 

     while (it.hasNext()) { 
      Node node = it.nextNode(); 
      String npath = node.getPath(); 
      Page contentPage = pageManager.getContainingPage(resourceResolver.getResource(npath)); 
      String title = contentPage.getTitle(); 
      String path = contentPage.getPath() + ".html"; 
      %> 
      <div class="searchresult"><a href="<%= path %>"><%= title %></a></div> 
      <% 
     } 
    } 

抛出的错误是:

Caused by: javax.jcr.RepositoryException: This query result has already been iterated through 

回答

4

难道不是因为你创建一个迭代两次: 首先

if (results.getNodes() != null && results.getNodes().hasNext()) {

然后

​​

我会尝试这样一次创建它:

QueryResult results = query.execute(); 
    NodeIterator it = results.getNodes(); 
    if (it.hasNext()) { 
    ... 
    } 

望着SimpleQueryResult的来源,它在做一些奇怪的事情,实例变量rowIterator被设置为null,所以下一次getRows被称为y ou'll去条件的其他部分,你就会有你mentionned错误:

public synchronized RowIterator getRows() throws RepositoryException { 
     if (rowIterator != null) { 
      RowIterator iterator = rowIterator; 
      rowIterator = null; 
      return iterator; 
     } else { 
      throw new RepositoryException(
        "This query result has already been iterated through"); 
     } 
} 

https://svn.apache.org/repos/asf/jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/SimpleQueryResult.java

+0

你真棒:)现在它的工作原理相当不错!非常感谢!! – Ahatius