SQL2 - 获取子节点属性

Del*_*ung 3 jcr jcr-sql2 aem

这似乎是一个相当简单的查询,但我一直在敲打我的头几个小时.我有一个类似于下面的节点结构:

food-group
    jcr:content
        nuts -> type=almonds
        meat -> beef=true
        fruit -> type=apples,oranges,bananas
Run Code Online (Sandbox Code Playgroud)

我需要从子节点收集三种类型的属性:一个是字符串,布尔和字符串数组.我认为以下sql2查询将工作并获取它们的属性,但无论出于何种原因我收到错误:

QUERY

SELECT 
    parent.* 
FROM 
    [cq:PageContent] AS parent 
INNER JOIN 
    [nt:base] as child ON ISCHILDNODE(parent) 
WHERE 
    ISDESCENDANTNODE(parent, [/content/grocerystore/food/])"
Run Code Online (Sandbox Code Playgroud)

错误:

Need to specify the selector name because the query contains more than one selector.
Run Code Online (Sandbox Code Playgroud)

感谢任何帮助,因为我过去几天一直在这里.

Ran*_*uch 7

ISCHILDNODE函数可以在JCR-SQL2查询中使用两个位置:在WHERE子句和连接条件中.不幸的是,它们采用不同的参数

您的查询试图使用ISCHILDNODE连接标准,它需要两个参数:为子节点选择名称,选择名称父节点.

这是我认为你想要的查询:

SELECT parent.* 
FROM [cq:PageContent] AS parent 
INNER JOIN [nt:base] as child ON ISCHILDNODE(child,parent) 
WHERE ISDESCENDANTNODE(parent, [/content/grocerystore/food/])
Run Code Online (Sandbox Code Playgroud)

唯一的变化是ISCHILDNODE函数的参数.

不幸的是,错误消息并没有真正说清楚.要理解为什么,有助于了解ISCHILDNODEWHERE条款中使用的另一种形式.该表单还有两个参数:表示子节点的选择器的名称,以及父节点的文字路径(生成的节点是子节点).这是一个使用这种形式的人为的查询:

SELECT node.*
FROM [nt:base] AS node
WHERE ISCHILDNODE(node,[/content/grocerystore])
Run Code Online (Sandbox Code Playgroud)

查询结果将包含作为节点子/content/grocerystore节点的所有节点.

现在,如果查询只定义了一个选择器(例如,非连接),那么只有一个选择器名称可以传递给该ISCHILDNODE函数.严格地说,选择器是隐式已知的,因此JCR-SQL2允许您仅传入路径.这是一个在语义上与之前设计的示例相同的查询:

SELECT node.*
FROM [nt:base] AS node
WHERE ISCHILDNODE([/content/grocerystore])
Run Code Online (Sandbox Code Playgroud)

这是ISCHILDNODE采用单个参数的唯一形式,我认为这是我认为CQ5期望的形式:错误表明查询定义了多个选择器,因此选择器必须作为第一个参数提供.

当然,这是非常误导的,因为您实际上使用的是连接条件中出现的函数形式.更好的错误消息会说该函数需要子选择器名称和父选择器名称.