gpt4 book ai didi

aem - SQL2 - 获取子节点属性

转载 作者:行者123 更新时间:2023-12-04 16:03:42 25 4
gpt4 key购买 nike

这似乎是一个相当简单的查询,但我已经为此绞尽脑汁好几个小时了。我有一个类似于下面的节点结构:

food-group
jcr:content
nuts -> type=almonds
meat -> beef=true
fruit -> type=apples,oranges,bananas

我需要从我的子节点收集三种类型的属性:一种是字符串、 bool 值和字符串数组。我认为以下 sql2 查询可以正常工作并获取它们的属性,但无论出于何种原因,我都会遇到错误:

查询

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

错误:

Need to specify the selector name because the query contains more than one selector.

感谢任何帮助,因为过去几天我一直在做这件事。

最佳答案

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/])

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

不幸的是,错误消息并没有真正说明这一点。要了解原因,了解 ISCHILDNODE 的另一种形式 - WHERE 子句中使用的形式会有所帮助。该表单还接受 两个 参数:将代表子节点的选择器的名称,以及父节点的文字路径(结果节点是子节点)。这是一个使用这种形式的人为查询:

SELECT node.*
FROM [nt:base] AS node
WHERE ISCHILDNODE(node,[/content/grocerystore])

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

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

SELECT node.*
FROM [nt:base] AS node
WHERE ISCHILDNODE([/content/grocerystore])

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

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

关于aem - SQL2 - 获取子节点属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23973393/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com