0

我试图解决的用例是:

在 /apps 下查找所有组件的所有页面引用。

即首先找到正在使用某个组件的所有页面,然后对/apps 下的所有组件执行此操作。

通过使用 Adob​​e AEM 的报告生成器工具:https ://adobe-consulting-services.github.io/acs-aem-commons/features/report-builder/configuring.html

查询我正在尝试:

SELECT * FROM [nt:base] AS s 
WHERE [sling:resourceType] IN (SELECT path FROM [cq:Component] AS s WHERE [componentGroup] IS NOT NULL AND ISDESCENDANTNODE([/apps])) 
AND ISDESCENDANTNODE([/content])

背景: 我只需要从内部查询中清理结果集。如果没有清理,它会吐出表单的路径/apps/acs-commons/components/utilities/report-builder/columns/text, 而来自外部查询的sling:resourceType只能接受acs-commons/components/utilities/report-builder/columns/text。所以我需要/apps/从内部查询结果集路径中剥离出来。

这是错误消息:

Caused by: java.text.ParseException: Query: SELECT * FROM [nt:base] AS s 
WHERE [sling:resourceType] IN (SELECT(*)CAST(path, AS STRING) FROM [cq:Component] AS s WHERE [componentGroup] IS NOT NULL AND ISDESCENDANTNODE([/apps])) 
AND ISDESCENDANTNODE([/content]); expected: static operand
4

1 回答 1

0

我不认为您可以使用jcr sql2语法来操作结果集,存储过程通常用于操作类似于 PL/SQL 的结果集,我在 jcr 文档中没有找到任何对此的引用。事实上,据我所知,jcr 甚至不支持聚合函数,如MAX(),COUNT()

执行此操作的黑客方法 -> 您可能必须先执行内部查询以检索 中的所有组件/apps,手动修改结果集(剥离/apps)并将其提供给外部查询。

SELECT * FROM [nt:unstructured] AS comp
WHERE ISDESCENDANTNODE(comp, "/content/prj")
AND [sling:resourceType] IN ("prj/components/content/accordion","prj/components/content/breadcrumb")

为了加快这个过程,您可以使用notepad++等文本编辑器来帮助您进行块选择(ctrl + alt + shift,然后左键单击鼠标按钮并拖动以选择)删除/apps,添加开始/结束双引号,逗号和替换newline char 将所有内容集中在一行中并构建整体查询。

有兴趣知道其他人的想法,以及这是否可以通过jcr sql2语法来完成。

于 2018-09-24T06:57:49.127 回答