当前位置: 首页 > 知识库问答 >
问题:

SQL2-获取子节点属性

楚丰羽
2023-03-14

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

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

我需要从子节点收集三种类型的属性:一种是字符串、布尔值和字符串数组。我认为下面的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.

感谢您的帮助,因为我已经在这几天了。

共有2个答案

赫连明诚
2023-03-14

如果对具有多个选择器的QueryResult调用getNodes()方法(在您的情况下是parentchild),将引发此异常。如果在resourcesolver上调用findResources(),也将使用此方法。

改用QueryResult#getRows()方法:

Session session = resourceResolver.adaptTo(Session.class);
QueryManager queryManager = session.getWorkspace().getQueryManager();
Query query = queryManager.createQuery("...", Query.JCR_SQL2);
QueryResult result = query.execute();
// consider using result.getColumnNames() here
RowIterator rows = result.getRows();
while (rows.hasNext()) {
    Row row = rows.nextRow();
    // use row.getValue() or row.getValues()
}

几句话:

  • 您需要修复SQL查询,将child作为第一个参数添加到ISCHILDNODE(parent)
喻渊
2023-03-14

JCR-SQL2查询中有两个地方可以使用ISCHILDNODE函数:在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期望的形式:错误表示查询定义了多个选择器,因此必须将选择器作为第一个参数提供。

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

 类似资料:
  • 我有一个SVG文档,其中包含类似于以下内容的节点: 我想做的只是选择

  • 你如何获得子节点内容与JavaScript具体? 我可以通过以下方式获取父节点信息: 花岗岩资源属性 但是我需要访问子节点 -家长 --子对象(命名图像) 有很多方法可以通过Java访问子节点,但我正在构建一个只使用JavaScript的解决方案: 下面是Java示例

  • 你们这些家伙,我有这样一个HTML: 这是将上述所有选项放入列表的代码: 实际上它不起作用。我不知道我错在哪里。请帮帮我。非常感谢。

  • 问题内容: 我正在尝试读取xml文件,例如: 这是我到目前为止的代码: 这是我尝试编写此代码的尝试,怎么说都不成功,这就是我开始赏金的原因。这是http://pastebin.com/huKP4KED。 赏金更新: 我确实真的尝试了好几天,但现在没想到会这么难,我会接受有用的链接/书籍/教程,但更喜欢代码,因为我昨天需要这样做。 这是我需要的: 关于上面的xml: 我需要获取标题ID的值 temp

  • 问题内容: 我想知道,JavaScript提供了多种方法来从任何元素中获取第一个子元素,但是哪种方法最好呢?最好的意思是:在行为方面,大多数跨浏览器兼容,最快,最全面且可预测。我用作别名的方法/属性的列表: 这适用于两种情况: 在表单或迭代的情况下。如果我可能遇到文字元素: 据我所知,使用来自的NodeList ,并使用。我将这一假设基于MDN参考: 是对元素节点的第一个子元素的引用,或者如果不存