如何在JCR:SQL2中获取子字符串?

时间:2018-09-22 00:28:02

标签: string adobe aem jcr-sql2

我要解决的用例是:

  

在/ 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

1 个答案:

答案 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语法来实现。