我在查询jackrabbit中的jcr节点时遇到困难,包含某些属性。
我添加了一个自定义节点来为其添加mixin属性。
<custom = 'http://example.com/mydomain'>
[custom:extensible] mixin
- * (undefined) multiple
- * (undefined)
然后我按以下方式添加一个nt:文件节点和那些nt:file我添加我的自定义: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')
答案 0 :(得分: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 *
可能意味着您的结果包含重复列,因此您可以考虑明确选择您感兴趣的列。