这似乎是一个相当简单的查询,但我一直在敲打我的头几个小时.我有一个类似于下面的节点结构:
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)
感谢任何帮助,因为我过去几天一直在这里.
该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函数的参数.
不幸的是,错误消息并没有真正说清楚.要理解为什么,有助于了解ISCHILDNODE该WHERE条款中使用的另一种形式.该表单还有两个参数:表示子节点的选择器的名称,以及父节点的文字路径(生成的节点是子节点).这是一个使用这种形式的人为的查询:
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期望的形式:错误表明查询定义了多个选择器,因此选择器必须作为第一个参数提供.
当然,这是非常误导的,因为您实际上使用的是连接条件中出现的函数形式.更好的错误消息会说该函数需要子选择器名称和父选择器名称.
| 归档时间: |
|
| 查看次数: |
5740 次 |
| 最近记录: |