0

我想做这样的事情,但是在 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();

但是,我如何只在该节点下查询呢?

4

1 回答 1

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,namePropversionProp作为硬编码的属性名称,但您可以使用 Java 字符串连接轻松构建表达式字符串。我还使用了绑定变量(例如和) $pluginId,您也可以将它们替换为 Java 字符串连接或使用 JCR 的绑定变量机制:$platform$version

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 的项目负责人。)

于 2012-01-17T20:01:30.787 回答