問題点

次のクエリーを実行すると、getNodes() から RepositoryException がスローされます。

サンプルコード:

Session session = resourceResolver.adaptTo(Session.class);
QueryManager queryManager = session.getWorkspace().getQueryManager();

String queryString = "SELECT child.*, page.[cq:lastReplicated] FROM [cq:PageContent] AS page "
              + "INNER JOIN [nt:unstructured] AS child ON ISCHILDNODE(child,page) "
              + "WHERE ISDESCENDANTNODE(page,'/content/geometrixx/en/') ";

Query query = queryManager.createQuery(queryString, Query.JCR_SQL2);
QueryResult result = query.execute();

NodeIterator nodes = result.getNodes();

例外:

javax.jcr.RepositoryException: Query contains more than one selector: [child, page]
	at org.apache.jackrabbit.oak.jcr.query.QueryResultImpl.getNodes(QueryResultImpl.java:161)

API リファレンス:
https://docs.adobe.com/content/docs/en/spec/javax.jcr/javadocs/jcr-2.0/javax/jcr/query/QueryResult.html#getNodes()
RepositoryException - クエリーが複数のセレクターを含んでいる場合

環境

AEM

原因

クエリーに複数のセレクターが含まれている場合は、セレクター(子やページなど)を指定する必要があります。

解決策

getRows メソッドを、getNodes の代わりに使用します。

Query query = queryManager.createQuery(queryString, Query.JCR_SQL2);
QueryResult result = query.execute();

RowIterator rows = result.getRows();
while (rows.hasNext()) {
    Row row = rows.nextRow();
    Node node = row.getNode("page");
}

追加情報

CQ 5.6 でクエリー (inner join) を実行するとリポジトリー例外が発生する
http://help-forums.adobe.com/content/adobeforums/jp/experience-manager-forum/adobe-experience-manager.topic.html/forum__4rih-hi_i_am_running.html

本作品は Creative Commons Attribution-Noncommercial-Share Alike 3.0 Unported License によってライセンス許可を受けています。  Twitter™ および Facebook の投稿には、Creative Commons の規約内容は適用されません。

法律上の注意   |   プライバシーポリシー