1

我在查询 jackrabbit 中包含某些属性的 jcr 节点时遇到困难。

我添加了一个自定义节点来为其添加 mixin 属性。

<custom = 'http://example.com/mydomain'>
[custom:extensible] mixin
- * (undefined) multiple 
- * (undefined) 

然后我以以下方式添加一个 nt:file 节点,并在这些 nt:file 中添加我的 custom:extensible

documents = session.getRootNode().getNode(MainJCRConstants.MAIN_NODE);
documentNode = documents.addNode(fileName, NodeType.NT_FILE);
Node resNode = documentNode.addNode(JcrConstants.JCR_CONTENT, NodeType.NT_RESOURCE);
Binary binary = session.getValueFactory().createBinary(ins);
resNode.setProperty(JcrConstants.JCR_DATA, binary);
resNode.addMixin("custom:extensible");
resNode.setProperty("sourceSystem", "internal");

现在我想查询所有 [nt:file] 节点,包含属性“sourceSystem”,其值等于“internal”。

在查看了我的文档后,我必须使用类似于:

SELECT parent.* FROM [nt:file] AS parent 
INNER JOIN [custom:extensible] AS child ON ISCHILDNODE(child,parent) 
WHERE CONTAINS(parent.*, 'internal') OR CONTAINS(child.*,'internal')

但这会引发异常http://pastebin.com/ZdxZPf2C

此外,我尝试过的所有其他查询要么引发异常,要么返回空结果集。

解决方案:

SELECT * FROM [nt:resource] as res INNER JOIN [custom:extensible] AS ext ON ISSAMENODE(res,ext) WHERE CONTAINS(res.sourceSystem,'internal') OR CONTAINS(ext.sourceSystem,'internal')
4

1 回答 1

1

您可以通过主要类型和 mixin 查询节点,并且确实需要使用 JOIN。但是,加入条件应该是一个ISSAMENODE条件:

SELECT * FROM [nt:file] AS file
   INNER JOIN [custom:extensible] AS ext ON ISSAMENODE(file,ext)
WHERE CONTAINS(file.*,'internal') OR CONTAINS(ext.*,'internal')

此查询将所有nt:file节点与所有custom:extensible节点连接起来,确保当nt:file节点和custom:extensible节点是同一个节点时,结果中的唯一配对发生。

另请注意,这SELECT *可能意味着您的结果包含重复的列,因此您可以考虑明确选择您感兴趣的列。

于 2013-11-05T14:52:24.307 回答