我想做这样的事情,但是在JCR_SQL2中(因为XPATH现在在JCR 2.0中已被弃用)。
QueryManager queryManager = session.getWorkspace().getQueryManager();
String queryExpression =
NodeNames.PLUGIN.jcrName()+"[@"+NodeProps.ID.jcrName()+"='"+pluginId+"']"
+"/"+
NodeNames.PLATFORM.jcrName()+"[@"+NodeProps.NAME.jcrName()+"='"+platform+"']"
+"/"+
NodeNames.VERSION.jcrName()+"[@"+NodeProps.VERSION.jcrName()+"='"+version+"']";
query = queryManager.createQuery( queryExpression, Query.XPATH);
return query.execute().getNodes().nextNode();
我可以像这样得到第一个节点:
Query query = queryManager.createQuery(
"select * from [nt:unstructured] as p where p.["+NodeProps.ID.jcrName()
+"] = '"+pluginId+"'", Query.JCR_SQL2);
Node pluginNode = query.execute().getNodes().nextNode();
但是,我如何仅在该节点下查询?
答案 0 :(得分:4)
由于您在三个节点上放置约束(即,底部不受版本约束,其父级受平台约束,平台节点的父级受插件约束),您需要执行三向节点加入:
SELECT * FROM [nt:unstructured] AS plugin
JOIN [nt:unstructured] AS platform ON ISCHILDNODE(platform,plugin)
JOIN [nt:unstructured] AS version ON ISCHILDNODE(version,platform)
WHERE plugin.idProp = $pluginId
AND platform.nameProp = $platform
AND version.versionProp = $version
为清楚起见,我使用idProp
,nameProp
和versionProp
作为硬编码属性名称,但您可以使用Java字符串连接轻松地构建表达式字符串。我还使用了绑定变量(例如,$pluginId
,$platform
和$version
),您也可以用Java字符串连接替换它们或使用JCR的绑定变量机制:
Session session = ...
String expression = "SELECT * FROM ..."; // as above
String pluginId = ...
String platform = ...
String version = ...
QueryManager queryMgr = session.getWorkspace().getQueryManager();
Query query = queryMgr.createQuery(expression,Query.JCR_SQL2);
query.bindValue("pluginId",pluginId);
query.bindValue("platform",platform);
query.bindValue("version",version);
QueryResult result = query.execute();
IMO,JCR-SQL2表达式是相当可读的(如果使用Java字符串连接可能不那么可能),但您可能认为XPath更具可读性。但这是JCR 2.0查询系统的优点,因为您实际上可以选择最适合您应用程序部分需求的语言。
正因为如此,Jackrabbit和ModeShape(任何其他JCR 2.0实现?)都计划支持XPath语言,即使它被JCR 2.0规范弃用了。
最后,ModeShape会将上面列出的XPath查询和JCR-SQL2查询解析为相同的JCR-JQOM表示,因此处理将是相同的。
(免责声明:我是ModeShape的项目负责人。)