我要解决的用例是:
在/ apps下查找所有组件的所有页面引用。
即首先找到正在使用组件的所有页面,然后 然后对/ apps下的所有组件执行此操作。
通过使用Adobe AEM的报表构建器工具:commit 3900689
我正在尝试查询:
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
形式的 path
而来自外部查询的 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
答案 0 :(得分:0)
我认为您无法使用jcr sql2
语法来操作结果集,通常使用存储的proc来操作类似于PL / SQL的结果集,并且在jcr docs中没有找到对此的任何引用。实际上,据我所知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,添加开始/结束双引号,逗号并替换换行符char以将其全部放在一行中并构建整体查询。
有兴趣知道别人的想法,以及是否可以仅使用jcr sql2
语法来实现。