如何在JCR 2.0 SQL2中执行多级属性查询?

时间:2012-01-17 16:08:58

标签: java jcr jcr-sql2

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

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

1 个答案:

答案 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

为清楚起见,我使用idPropnamePropversionProp作为硬编码属性名称,但您可以使用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的项目负责人。)